在MKMapKit MKAnnotation子类中更改图像

时间:2012-07-18 08:22:09

标签: objective-c ios mkmapview mkannotation mkannotationview

我在更改MKAnnotationView子类中的图像视图时遇到了一些问题。我有一个计时器,根据用户在某一点的位置数据更新注释位置。这工作正常,注释位置正确更新。我使用以下代码执行此操作:

[_myAnnotation setCoordinate:point.position];

在此之下,我还计算用户是朝东还是西。如果用户向东航行,我会调用setIsMovingRight:YES类上的MyAnnotation方法,并在用户向西航行时执行相反操作。

我已经验证了在正确的时间使用正确的值调用方法,方法是在方法内使用NSLog,以便在值发生变化时打印输出。但是,setIsMovingRight方法似乎对注释的视觉外观没有任何影响。每当调用方法时,我都会尝试将imageview的背景颜色设置为红色,但即使这样也没有效果。我试过在各个地方调用setNeedsDisplay但没有成功。

我可以添加并重新创建注释视图,但只要位置发生变化,注释就会闪烁,但实际上看起来并不是很好。

以下是我的自定义注释视图“MyAnnotation”的代码。

@interface MyAnnotation : MKAnnotationView <MKAnnotation>
{
    UIImageView *_imageView;
    BOOL _currentlyMovingRight;
}

@property (nonatomic) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;

@property (nonatomic,retain) UIImage  *image;

-(void)setIsMovingRight:(BOOL)movingRight;

@end

@implementation MyAnnotation

@synthesize coordinate, title, subtitle, image;

-(id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    if(self)
    {
        _currentlyMovingRight = NO;
        _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.png"]];
        [self addSubview:_imageView];
    }
    return self;
}

-(void)setIsMovingRight:(BOOL)movingRight
{
    _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
    [_imageView setBackgroundColor:[UIColor redColor]]; // THIS LINE NEVER DOES ANYTHING.

    if(movingRight && !_currentlyMovingRight)
    {
        NSLog(@"right now.");
        [_imageView setImage:[UIImage imageNamed:@"right.png"]];
    }
    else if (!movingRight && _currentlyMovingRight)
    {
        NSLog(@"left now.");
        [_imageView setImage:[UIImage imageNamed:@"left.png"]];
    }
    _currentlyMovingRight = movingRight;

    [self addSubview:_imageView];
    [self setNeedsDisplay];
}

我将不胜感激,任何人都可以给予任何帮助或建议。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为注释视图使用KVO来监听更改。您是否尝试过更改image属性?像[self setImage:myNewImage]

这样的东西