如何将 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)的主要内容,如果未能解决你的问题,请参考以下文章
显示键盘 + iPad 时 UIPopoverView 变得扭曲
Android:如何将地图视图的缩放级别设置为当前位置周围 1 公里半径?