2009-08-20 2 views
2

Не вдаваясь в OpenGL (Quartz 2D ОК):Анимационные спрайт через MKMapView

  1. Скажем, у меня есть образ, который я хочу, чтобы перемещаться по карте в какой-то жидкости образом. Например, изображение плоскости, «летящей» по карте. Я смог сделать это, используя MKAnnotation, NSTimer и возиться со скоростью изменения lat/lon и скоростью таймера. Тем не менее, я полагаю, что это не идеально, хотя результаты выглядят довольно прилично. Можете ли вы придумать лучший способ?

  2. Теперь предположим, что я хочу, чтобы этот образ был анимированным (думаю: анимированный gif). Я не могу сделать обычный UIImageView с серией animationFrames, потому что у меня есть доступ в MKAnnotationView, это UIImage. Как вы, ребята, решаете это?

Я понимаю, что # 2 можно было обработать с помощью UIImageView поверх карты, содержащей анимацию. Однако тогда мне пришлось бы вручную обрабатывать перемещение самолета или ракеты или что-то еще, поскольку область обзора карты изменилась, в зависимости от движений пользователя в реальном мире или масштабирования пользователя (прокрутка в моем приложении не разрешена).

Как вы думаете?

ответ

5

Я думаю, что я нашел решение для # 2. Я подклассифицировал MKAnnotationView и написал код для добавления UIImageView (с анимационными изображениями) в качестве подзапроса.

//AnimatedAnnotation.h 

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 

@interface AnimatedAnnotation : MKAnnotationView 
{ 
    UIImageView* _imageView; 
    NSString *imageName; 
    NSString *imageExtension; 
    int imageCount; 
    float animationDuration; 
} 

@property (nonatomic, retain) UIImageView* imageView; 
@property (nonatomic, retain) NSString* imageName; 
@property (nonatomic, retain) NSString* imageExtension; 
@property (nonatomic) int imageCount; 
@property (nonatomic) float animationDuration; 


- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier imageName:(NSString *)name imageExtension:(NSString *)extension imageCount:(int)count animationDuration:(float)duration 
; 

@end 

//AnimatedAnnotation.m

#import "AnimatedAnnotation.h" 

@implementation AnimatedAnnotation 
@synthesize imageView = _imageView; 
@synthesize imageName, imageCount, imageExtension,animationDuration; 

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier imageName:(NSString *)name imageExtension:(NSString *)extension imageCount:(int)count animationDuration:(float)duration 
{ 
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
    self.imageCount = count; 
    self.imageName = name; 
    self.imageExtension = extension; 
    self.animationDuration = duration; 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@0.%@",name,extension]]; 
    self.frame = CGRectMake(0, 0, image.size.width, image.size.height); 
    self.backgroundColor = [UIColor clearColor]; 


    _imageView = [[UIImageView alloc] initWithFrame:self.frame]; 
    NSMutableArray *images = [[NSMutableArray alloc] init]; 
    for(int i = 0; i < count; i++){ 
     [images addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%@%d.%@", name, i, extension]]]; 
    } 


    _imageView.animationDuration = duration; 
    _imageView.animationImages = images; 
    _imageView.animationRepeatCount = 0; 
    [_imageView startAnimating]; 

    [self addSubview:_imageView]; 

    return self; 
} 

-(void) dealloc 
{ 
    [_imageView release]; 
    [super dealloc]; 
} 


@end 
Смежные вопросы