MKAnnotationView框架大小不会更新MapView直到缩放

时间:2012-05-26 23:28:18

标签: objective-c ios mkannotation mkannotationview

我正在尝试使用自定义按钮实现自定义MKAnnotationView。我不想使用MKAnnotation的callout属性,因为无法访问该视图的框架。相反,我使用MKAnnotationView视图添加我的UIView与我的自定义标注气泡。一切都很好,即使触摸按钮也能捕捉到。唯一的问题是调整MKAnnotationView框架的大小。我可以在我的自定义MKAnnotationView中的(void)setSelected:(BOOL)selected animated:(BOOL)animated方法中执行该操作,该方法是MKAnnotationView的子类,但是当调整大小的视图应该在MapView上显示时,这只能通过放大或缩小地图来实现。我尝试过needsLayoutneedsDisplay之类的内容,但没有成功。

我做错了什么?放大和缩小时MapView调用的方法是什么,所以我可以调用它来刷新自定义MKAnnotationView框架?

以下是我创建的CustomMKAnnotationView类的一些代码:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated{

[super setSelected:selected animated:animated];

if (selected) { 
     self.frame = CGRectMake(0, 0, 170, 66);
     self.backgroundColor = [UIColor lightTextColor];
     self.centerOffset = CGPointMake(54.5, -33);
     self.image = nil;
     [self createBubble];
     [self animateIn];
     [self addSubview:bubbleView];
}else{
     [bubbleView removeFromSuperview];
     self.frame = CGRectMake(0, 0, 13, 17);
     self.centerOffset = CGPointMake(0, 0);
}

}

1 个答案:

答案 0 :(得分:4)

我成功地把事情搞定了。我很确定我没有找到完美的方法来做到这一点,但它符合我的需求,最终没有影响用户体验。

我发现该帧实际上已添加到视图中,但是当我将frame origin设置为0,0时,视图已添加到我正在检查的缩放位置之外。

在注意到我注意到我能够将frame更改为我想要自定义气泡的正确位置。但是当我放大或缩小时,frame重新定位到不同的位置。事实证明centerOffset属性正在这样做,所以我必须匹配framecenterOffset属性才能让他们在屏幕上指向完全相同的点,结果非常令人满意。用户体验非常流畅。

以下是我创建的MKAnnotationView子类下的工作代码:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated{
[super setSelected:selected animated:animated];

if (selected) {

    //here's the trick: setting the frame to a new position and with different size.
    //as the bubble view is added here and matching that point in view with the
    //centerOffset position. The result looks doesn't affect user experience.
    CGRect frame;
    frame = self.frame;
    frame.size = CGSizeMake(170, 66);
    frame.origin = CGPointMake((self.frame.origin.x)-16.5,(self.frame.origin.y)-49);
    self.frame = frame;
    self.centerOffset = CGPointMake(61, -24.5);

    //remove the pin image from the view as the bubble view will be added
    self.image = nil;

    [self createBubble];
    [self animateIn];
    [self addSubview:bubbleView];

}else {

    [bubbleView removeFromSuperview];

    //reset the center offset and the frame for the AnnotationView to reinsert the pin image
    self.centerOffset = CGPointMake(0, 0);
    CGRect frame;
    frame = self.frame;
    //this is the size of my pins image
    frame.size = CGSizeMake(14, 17);
    frame.origin = CGPointMake((self.frame.origin.x)+16.5 ,(self.frame.origin.y)+49);
    self.frame = frame;

    //discover whats the point view image (I have different pin colors here)
    UIImage *pointImage = [[UIImage alloc] init];

    if ([flagStyle isEqualToString:@"friends"]) {

        pointImage = [UIImage imageNamed:@"point_f.png"];

    }else if([flagStyle isEqualToString:@"world"]){

        pointImage = [UIImage imageNamed:@"point_w.png"];        

    }else if([flagStyle isEqualToString:@"my"]){

        pointImage = [UIImage imageNamed:@"point_m.png"];        

    }


    self.image = pointImage;


}

}

我一直在寻找一个解决方案来创建一个带有标注气泡的自定义MKAnnotationView,里面有一个按钮,但我无法在互联网上找到任何适合我需求的东西。此解决方案有效。这不是完美的实施,而是完成工作。我希望能帮助这个人。