我正在尝试使用自定义按钮实现自定义MKAnnotationView。我不想使用MKAnnotation的callout属性,因为无法访问该视图的框架。相反,我使用MKAnnotationView视图添加我的UIView与我的自定义标注气泡。一切都很好,即使触摸按钮也能捕捉到。唯一的问题是调整MKAnnotationView框架的大小。我可以在我的自定义MKAnnotationView中的(void)setSelected:(BOOL)selected animated:(BOOL)animated
方法中执行该操作,该方法是MKAnnotationView的子类,但是当调整大小的视图应该在MapView上显示时,这只能通过放大或缩小地图来实现。我尝试过needsLayout
和needsDisplay
之类的内容,但没有成功。
我做错了什么?放大和缩小时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);
}
}
答案 0 :(得分:4)
我成功地把事情搞定了。我很确定我没有找到完美的方法来做到这一点,但它符合我的需求,最终没有影响用户体验。
我发现该帧实际上已添加到视图中,但是当我将frame origin
设置为0,0
时,视图已添加到我正在检查的缩放位置之外。
在注意到我注意到我能够将frame
更改为我想要自定义气泡的正确位置。但是当我放大或缩小时,frame
重新定位到不同的位置。事实证明centerOffset
属性正在这样做,所以我必须匹配frame
和centerOffset
属性才能让他们在屏幕上指向完全相同的点,结果非常令人满意。用户体验非常流畅。
以下是我创建的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,里面有一个按钮,但我无法在互联网上找到任何适合我需求的东西。此解决方案有效。这不是完美的实施,而是完成工作。我希望能帮助这个人。