Animere en sprite over en MKMapView

stemmer
2

Uten å komme inn OpenGL (Quartz 2D er OK):

  1. La oss si at jeg har et bilde som jeg ønsker å flytte over et kart på en eller annen væske måte. For eksempel, et bilde av et fly flying over kartet. Jeg har vært i stand til å gjøre dette ved hjelp av en MKAnnotation, en NSTimer og fikle med frekvensen av lat / lon endring og tidsur rate. Men jeg antar at dette ikke er ideelt, selv om resultatene ser ganske anstendig. Kan du tenke deg en bedre måte?

  2. Nå la oss si at jeg vil at dette bildet skal animeres (tenk: animerte gif). Jeg kan ikke gjøre det vanlige UIImageViewmed en rekke animationFramesfordi alt jeg har tilgang til i MKAnnotationView er en UIImage. Hvordan vil dere takle dette?

Jeg innser at # 2 kunne håndteres med en UIImageView på toppen av kartet inneholder animationImages. Men da jeg ville ha til å håndtere manuelt sette flytting av flyet eller rakett eller hva som regionen av mapview endres, avhengig av brukerens bevegelser i den virkelige verden, eller brukeren zoomer (rulling er ikke tillatt i min app).

Hva tror du?

Publisert på 20/08/2009 klokken 03:06
kilden bruker
På andre språk...                            


1 svar

stemmer
5

Jeg tror jeg har funnet ut en løsning til # 2. Jeg subclassed MKAnnotationView og skrev noen kode for å legge til en UIImageView (med animasjon bilder) som en subview.

//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
Svarte 20/08/2009 kl. 04:42
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more