如何将 UIPopoverView 显示为地图视图的注释? (iPad)

Posted

技术标签:

【中文标题】如何将 UIPopoverView 显示为地图视图的注释? (iPad)【英文标题】:How do I display a UIPopoverView as a annotation to the map view? (iPad) 【发布时间】:2011-04-07 14:16:51 【问题描述】:

在 iPad 上的地图应用程序中,当您点击一个图钉时,您会看到一个带有“i”而不是披露指示符的普通注释。进一步点击“i”会显示一个像这样的弹出视图控制器。

有没有办法轻松实现这一点?

【问题讨论】:

【参考方案1】:

首先在地图上添加一个注解,然后在viewForAnnotation 方法中,将rightCalloutAccessoryView 设置为一个按钮类型,比如UIButtonTypeDetailDisclosure(我认为蓝色信息按钮默认不可用)。

按下按钮将调用calloutAccessoryControlTapped 委托方法。在此方法中,取消选择注释并显示您的弹出框。例如:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

    [mapView deselectAnnotation:view.annotation animated:YES];

    YourContentViewController *ycvc = [[YourContentViewController alloc] init...
    UIPopoverController *poc = [[UIPopoverController alloc] initWithContentViewController:ycvc];
    [ycvc release];

    //hold ref to popover in an ivar
    self.annotationPopoverController = poc;

    //size as needed
    poc.popoverContentSize = CGSizeMake(320, 400);

    //show the popover next to the annotation view (pin)
    [poc presentPopoverFromRect:view.bounds inView:view 
        permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    [poc release];

YourContentViewController 是 UIViewController 的子类,您可以像任何其他视图控制器一样对其进行编码。 Maps 应用的内容中似乎包含 UITableView。

【讨论】:

很好的答案,非常详细。 在地图应用程序中有一个有趣的动画在这种情况下,而不是较小的气泡被消除并呈现新的弹出框,小气泡实际上会扩展以适应弹出框视图。任何想法如何做到这一点? @Chris Wagner:不知道地图应用程序是如何做到的,但尝试最初显示高度较小的弹出框,然后使用计时器或 performSelector:withObject:afterDelay,手动为 popoverContentSize 设置动画并重新呈现弹出框更新的矩形(原点向上移动,高度增加)。另一种选择可能是首先显示/动画从中间扩展的常规自定义 UIView,然后在其上显示最终大小的弹出框(并删除下面的自定义 UIView)。在地图应用中,标注也会向左/向右移动,这可以通过更新 view.calloutOffset 来完成。 annotationPopoverController 是 MKMapView 委托中的一个 ivar/属性,如注释所示。 仅供参考:此解决方案适用于 iPad,因为 iPhone 成语无法调用 UIPopoverController。【参考方案2】:

看来,要为弹出框提供更好的位置,您必须从该矩形中呈现它:

CGPoint lc_point = [mapView convertCoordinate:view.annotation.coordinate toPointToView:mapView];
CGRect lc_frame = CGRectMake(lc_point.x,lc_point.y-view.frame.size.height,0,0);

【讨论】:

【参考方案3】:

您可以使用像 Gordon Hughes 的 Animated Callout 这样的库。不幸的是,它仍然不能在 ios 6 上完美运行(标注出现异常)。

这里是 iOS 5:

【讨论】:

【参考方案4】:

我的要求与此问题类似,但还需要允许用户在显示标注时与地图进行交互(平移和缩放)。 为此,我创建了这个 github 项目:https://github.com/crarau/mapkit-custom-callout

【讨论】:

以上是关于如何将 UIPopoverView 显示为地图视图的注释? (iPad)的主要内容,如果未能解决你的问题,请参考以下文章

将导航控制器用于 uipopoverview 的最佳方式

显示键盘 + iPad 时 UIPopoverView 变得扭曲

Android:如何将地图视图的缩放级别设置为当前位置周围 1 公里半径?

UIPopoverview for iPhone,iOS 7

如何在没有地图视图的情况下在自定义图像上显示用户位置

如何将地图列表中的项目显示到列表视图中