SMCalloutView 的目标是完全复制私有的 UICalloutView 系统控件。
我们都喜欢在点击 MKMapView 中的标记时得到的“气泡”。但是遗憾的是,无法在任何不在 MKMapView 之外的地方展示这种气泡式的“呼叫”UI。真可恶!所以这个类为了您的 convenience,痛苦地重新创建了这个方便的控制。
要在您自己的项目中使用 SMCalloutView,只需复制文件 SMCalloutView.h
和 SMCalloutView.m
。
默认情况下,SMCalloutView 将渲染为 iOS 7 中引入的新样式。如果您需要旧样式,只需将 SMClassicCalloutView.h
和 SMClassicCalloutView.m
包含到您的项目中,即可。有一个特殊类构造函数 +[SMCalloutView platformCalloutView]
,它将自动选择当前平台合适的呼叫类。
SMCalloutView.h
中的注释对如何使用该类进行了大量解释,但您需要的主要功能是 presentCalloutFromRect:
。您将指定您想添加调用到其中的视图以及定义弹出的“目标”应指向的矩形。目标矩形应位于目标视图的坐标系中(就像同名 UIPopover
方法一样)。这通常是作为目标视图的兄弟视图添加的弹出视图时 target.frame
,如果是将弹出视图添加到目标本身中,则为 target.bounds
。
您可以通过查看包含项目中的 UIViewController 子类来学习一个有效示例。
如果您只使用 title/titleView/subtitle/subtitleView
属性,则弹出的高度始终是“系统标准”。但是,如果您分配了 contentView
属性,弹出则会根据 contentView
的大小进行调整,并且忽略其他属性。
是的,弹出背景是 SMCalloutBackgroundView
实例。您可以设置自己的自定义 View
子类作为背景,或使用内置的子类之一。
SMCalloutMaskedBackgroundView
渲染 iOS-7 风格的背景。
SMCalloutImageBackgroundView
允许您指定组成可水平伸展背景的每个图像“片段”。
SMCalloutDrawnBackgroundView
使用CoreGraphics方法在任意大小上绘制背景。您可以复制 -drawRect
方法并修改参数以满足您的需求。
查看 ryanmaxwell的演示项目,这是实现这一功能的一种方法。(更多关于这个主题的讨论)
不是,但是其他勇敢的程序员已经做到了!
对于脉冲式的蓝色“当前位置”圆点的出色替换,请查看 Sam Vermette的SVPulsingAnnotationView。
至于户外地图数据和瓦片本身,请查看 Mapbox的iOS SDK,这是一个用于自定义地图的完整开源解决方案。它们甚至直接使用了 SMCalloutView
!
如果您想了解更多信息,请参阅 博客文章。