3

我想MKAnnotationView在地图上放置图钉并让图钉像动画一样进行MKUserLocation动画处理(带有圆形波的蓝点出现)

你如何实现这种类型的动画?我需要采取哪些步骤?

谢谢!

4

1 回答 1

3

像任何 UIView 一样对其进行动画处理!

自定义内容的子类 MKAnnotationView。不要通过重复的 addAnnotation 调用来动画它!那是错的

您可以像对待任何其他视图一样对待 annotationView..

这是一些具有图像闪烁动画的代码-此代码应该可以帮助您入门。

(不漂亮,但你的情况需要的确切东西!)

#import "DDViewController.h"
#import <MapKit/MapKit.h>
#import <QuartzCore/QuartzCore.h>

@interface DummyAnnotation : NSObject<MKAnnotation>
@end
@implementation DummyAnnotation
- (CLLocationCoordinate2D)coordinate { return CLLocationCoordinate2DMake(51, 10); }
- (NSString *)title { return @"Dummy"; }
@end

@interface DummyAnnotationView : MKAnnotationView
@end
@implementation DummyAnnotationView
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
    imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
    imageView.animationImages = @[[UIImage imageNamed:@"1.gif"],[UIImage imageNamed:@"2.gif"]];
    imageView.animationDuration = 5;
    [imageView startAnimating];
    [self addSubview:imageView];
    
    return self;
}
@end

@interface DDViewController() <MKMapViewDelegate>
@end
@implementation DDViewController

- (MKMapView*)mapView {
    return (MKMapView*)self.view;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //init a region
    MKCoordinateRegion region = MKCoordinateRegionMake(CLLocationCoordinate2DMake(51.0, 10.0), MKCoordinateSpanMake(2.0, 2.0));
    [self.mapView setRegion:region animated:NO];

    //add a dumy pin
    DummyAnnotation *ann = [[DummyAnnotation alloc] init];
    [self.mapView addAnnotation:ann];
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
    if([annotation isKindOfClass:[DummyAnnotation class]]) {
        DummyAnnotationView *view = (id)[mapView dequeueReusableAnnotationViewWithIdentifier:@"animated"];
        if(!view)
            view =[[DummyAnnotationView alloc ] initWithAnnotation:annotation reuseIdentifier:@"animated"];
        view.bounds = CGRectMake(0, 0, 59, 59);
        view.backgroundColor = [UIColor purpleColor];
        
        //
        //Animate it like any UIView!
            //
            
        CABasicAnimation *theAnimation;
    
        //within the animation we will adjust the "opacity"
        //value of the layer
        theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];             
            //animation lasts 0.4 seconds
        theAnimation.duration=0.4;
        //and it repeats forever
        theAnimation.repeatCount= HUGE_VALF;
        //we want a reverse animation
        theAnimation.autoreverses=YES;
        //justify the opacity as you like (1=fully visible, 0=unvisible)
        theAnimation.fromValue=[NSNumber numberWithFloat:1.0];
        theAnimation.toValue=[NSNumber numberWithFloat:0.1];
            
        //Assign the animation to your UIImage layer and the 
        //animation will start immediately
        [view.layer addAnimation:theAnimation forKey:@"animateOpacity"];
        
        return view;
    }
    return nil;
}

//---

@end

将工作示例上传到我的保管箱(它最终会消失,但上面的代码只是图像资源和 iOS 应用程序的默认样板代码):: https://dl.dropbox.com/u/3753090/test 。压缩

于 2013-02-17T10:11:23.147 回答