2012-08-23 46 views
1

我想動畫我添加爲MKOverLay的圓。我希望它從屏幕的頂部掉落。如何通過委託方法進行動畫製作?還是在添加覆蓋?任何人都可以將我指向正確的方向嗎?謝謝!動畫viewForOverlay MKCircleView

我有這樣的MapView的委託方法

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay 
{ 

    if([overlay isKindOfClass:[MKCircle class]]) { 
     // Create the view for the radius overlay. 
     MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay]; 
     circleView.strokeColor = [UIColor whiteColor]; 
     circleView.fillColor = [[UIColor blueColor] colorWithAlphaComponent:0.2]; 

     return circleView; 
    } 

    return nil; 
} 

我補充覆蓋,像這樣:

 MKCircle *circle = [MKCircle circleWithCenterCoordinate:userCoord radius:200]; 
     [mainMapView addOverlay:circle]; 

回答

1

比方說,你想有一個規模達+動畫褪色,你可以這樣做:

@interface MyMapOverlayView : UIView<CAAction> 
@end 

@implementation MyMapOverlayView 

- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event 
{ 
    if ([ event isEqualToString:@"onOrderIn" ]) 
    { 
     return self ; 
    } 

    return [ super actionForLayer:layer forKey:event ] ; 
} 

- (void)runActionForKey:(NSString *)event object:(id)anObject arguments:(NSDictionary *)dict 
{ 
    if ([ event isEqualToString:@"onOrderIn" ]) 
    { 
     { 
      CABasicAnimation * anim = [ CABasicAnimation animationWithKeyPath:@"transform" ] ; 
      anim.fromValue = [ NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1f, 0.1f, 1.0f) ] ; 
      [ self.layer addAnimation:anim forKey:nil ] ; 
     } 

     { 
      CABasicAnimation * anim = [ CABasicAnimation animationWithKeyPath:@"opacity" ] ; 
      anim.fromValue = @0.0f ; 
      [ self.layer addAnimation:anim forKey:nil ] ; 
     } 
    } 
} 

@end 

注:我參加了一個猜測你怎麼可能在一次添加這些動畫您的疊加層將添加到地圖視圖,但我沒有對其進行測試。你需要做實驗。您可能可以在創建視圖時對其進行設置。

更新:我測試了它,它似乎工作。

+0

我實際上想在此方法上添加我繪製圓形覆蓋圖的方法。我應該將上面的代碼添加到MyCustomCircle類中嗎? MKCircle * circle2 = [MKCircle circleWithCenterCoordinate:userCoord radius:[self convertToMetersFromDegrees:radius]]; MyCustomCircle * myCircleView = [[MyCustomCircle alloc] initWithCircle:circle2]; [mainMapView addOverlay:myCircleView.circle]; – Eric

+0

我會說,如果你正在動畫myCircleView,將這段代碼添加到MyCustomCircle - 它會動畫,當它被添加到父視圖 – nielsbot

1

下面是一些未經測試的代碼。如果確實有效,您可能需要更改動畫。

- (void)mapView:(MKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews 
{ 
    for (MKOverlayView *view in overlayViews) { 

     CGRect endFrame = view.frame; 
     view.frame = CGRectMake(endFrame.origin.x, endFrame.origin.y-500, 0, 0); 

     [UIView animateWithDuration:1.0 animations:^{ 
      view.frame = endFrame; 
     }]; 
    } 
} 
+0

代碼正在觸發,並且斷點正在觸及for循環中的for和for語句,但沒有動畫。如果我將-500更改爲-50000並取走動畫塊,則會在地圖上繪製該圓圈,並將其放在應該出現的位置的北方。當我將動畫添加回來時,該圓圈就會出現在它應該在的位置(view.frame)。爲什麼即使我知道代碼被調用,動畫也不實際工作? – Eric

+0

我不確定。這段代碼是從我用來爲註解視圖創建動畫的東西中提取出來的,我從來沒有用疊加層嘗試過。動畫塊是iOS 4+,但我假設你正在使用它,因爲它沒有崩潰。檢查前後的框架,看看發生了什麼。 –

+1

請勿使用「框架」進行動畫製作。更好的選擇是通過'transform'進行動畫處理。例如從一些偏移量+ 100x,+ 100y到身份變換。 – nielsbot