Анимация спрайта через MKMapView - PullRequest
2 голосов
/ 20 августа 2009

Не входя в OpenGL (Quartz 2D в порядке):

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

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

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

Что вы думаете?

1 Ответ

5 голосов
/ 20 августа 2009

Думаю, я нашел решение для №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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...