为了账号安全,请及时绑定邮箱和手机立即绑定

如何自定义MKAnnotationView的标注气泡?

如何自定义MKAnnotationView的标注气泡?

跃然一笑 2019-11-21 14:44:03
我目前正在使用mapkit,并且卡住了。我正在使用一个自定义注释视图,并且我想使用image属性使用自己的图标在地图上显示该点。我的工作很好。但是我还想做的是覆盖默认的标注视图(触摸注释图标时标题/副标题出现的气泡)。我希望能够控制标注本身:mapkit仅提供对左侧和右侧辅助标注视图的访问,但是无法为标注气泡提供自定义视图,也不能为其提供零大小,或者其他任何方式。我的想法是在my中重写selectAnnotation / deselectAnnotation MKMapViewDelegate,然后通过调用自定义注释视图来绘制自己的自定义视图。这有效,但仅当在我的自定义批注视图类中canShowCallout设置为时才有效YES。如果我将此设置为NO,则不会调用这些方法(这是我想要的,因此不会绘制默认的标注气泡)。因此,我无法知道用户是否触摸了地图上的我的点(选中了它)或触摸了一个不属于我的注释视图的点(选中了它)而没有显示默认的标注气泡视图。我尝试走另一条路,只是自己在地图上处理所有触摸事件,但似乎无法正常工作。我读了其他与在地图视图中捕获触摸事件有关的帖子,但它们并不是我想要的。有没有办法在绘制之前深入地图视图以删除标注气泡?我很茫然。有什么建议么?我是否缺少明显的东西?
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

有一个更简单的解决方案。


创建一个自定义UIView(用于您的标注)。


然后创建的子类MKAnnotationView,并重写setSelected如下:


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

{

    [super setSelected:selected animated:animated];


    if(selected)

    {

        //Add your custom view to self...

    }

    else

    {

        //Remove your custom view...

    }

}

景气,工作完成了。


查看完整回答
反对 回复 2019-11-21
?
慕村9548890

TA贡献1884条经验 获得超4个赞

继续@TappCandy出色的简单答案,如果您想以与默认气泡相同的方式为气泡设置动画,则我制作了以下动画方法:


- (void)animateIn

{   

    float myBubbleWidth = 247;

    float myBubbleHeight = 59;


    calloutView.frame = CGRectMake(-myBubbleWidth*0.005+8, -myBubbleHeight*0.01-2, myBubbleWidth*0.01, myBubbleHeight*0.01);

    [self addSubview:calloutView];


    [UIView animateWithDuration:0.12 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^(void) {

        calloutView.frame = CGRectMake(-myBubbleWidth*0.55+8, -myBubbleHeight*1.1-2, myBubbleWidth*1.1, myBubbleHeight*1.1);

    } completion:^(BOOL finished) {

        [UIView animateWithDuration:0.1 animations:^(void) {

            calloutView.frame = CGRectMake(-myBubbleWidth*0.475+8, -myBubbleHeight*0.95-2, myBubbleWidth*0.95, myBubbleHeight*0.95);

        } completion:^(BOOL finished) {

            [UIView animateWithDuration:0.075 animations:^(void) {

                calloutView.frame = CGRectMake(-round(myBubbleWidth/2-8), -myBubbleHeight-2, myBubbleWidth, myBubbleHeight);

            }];

        }];

    }];

}

它看起来相当复杂,但是只要您将标注气泡的点设计为居中,您就应该可以替换myBubbleWidth并myBubbleHeight以自己的大小工作。并记住确保子视图的autoResizeMask属性设置为63(即“全部”),以便它们在动画中正确缩放。


:-乔


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 989 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信