UIView 标注气泡

Posted

技术标签:

【中文标题】UIView 标注气泡【英文标题】:UIView Callout Bubble 【发布时间】:2009-12-26 10:20:51 【问题描述】:

当用户在标准视图中触摸 UILabel 时,我希望能够执行 MapView 标注之类的操作。这不是地图视图!或者我可以将鼠标悬停在新的 UIView 上吗?

谁能指点我正确的方向?

谢谢,

【问题讨论】:

【参考方案1】:

我最近这样做了。

您需要两个 UIView 子类:一个外部视图(绘制背景并处理消除气泡)和一个内部视图(绘制气泡本身)。我打电话给我的 IMPBubbleView 和 IMPBubbleInternalView。

在 IMPBubbleView 中,它会将自己设置为当前 UIWindow 的大小,然后将自己添加为窗口的子视图。调用者必须传入一个气泡应该指向的矩形:通过执行 convertRect:toView:(UIView 上的一个方法)并传入 IMPBubbleView 来确定它在窗口中的位置。

IMPBubbleView 创建一个 IMPBubbleInternalView 对象,并将其添加为 self 的子视图。

需要确定是否有空间可以在矩形下方或上方绘制气泡(因此气泡不会最终脱离屏幕)。您可以使气泡视图采用传入的 UIView 对象在其中显示:这是最可重用的 API。然后,您可以询问此视图的大小。一些简单的数学运算,并设置 IMPBubbleInternalView 的 bubbleOnTop 属性。

为了实际绘制气泡本身,我移植了一些 Matt Gemmel 的代码(位于 http://mattgemmell.com/source)来创建气泡轮廓的路径。然后我用以下颜色填充它:

    CGFloat locations[5] =  0.0, 0.5, 0.65, 0.65, 1.0 ;
CGFloat components[20] =  0.0, 0.0, 0.0, 1.0,  // Start color
                          58.0/255, 58.0/255, 58.0/255, 1.0,
                          58.0/255, 58.0/255, 58.0/255, 1.0,
                          91.0/255, 91.0/255, 91.0/255, 1.0,
                          144.0/255, 144.0/255, 144.0/255, 1.0 ; // End color

当您显示 IMPBubbleInternalView 时,您可以使用 Core Animation 使其淡入,或稍微放大然后缩小,或其他任何方式。

最后,您需要处理 IMPBubbleView(绘制背景)中的点击。点击此处应消除气泡。覆盖 touchesEnded:withEvent: 并在触摸对象上使用 locationInView: 方法(以确保您正在处理气泡外的点击)。

我认为这就是一切。我有很多用于添加按钮的东西(我正在模拟复制/粘贴菜单)。

【讨论】:

【参考方案2】:

this answer 中提供了一些可下载的代码来做类似的事情。

【讨论】:

【参考方案3】:

我的方法是创建一个 png 图像,以气泡的样式(当然只对固定大小的气泡有用),子类 UIView,并在创建时将此图像绘制到 UIView 的背景中,我还会添加一个 UILabel 或 UIImage 取决于我想要做什么,无论是显示文本还是图像。

如果你想做可变大小的图像,你会想使用 Quartz2D 并绘制你需要的矩形。虽然这需要更多的工作,但如果做得好,您最终会得到一个更可扩展的组件。

下一步是继承UILabel,并添加一个响应touchesBegan(UIResponder)方法的方法,每次触摸时都会调用它。然后,您可以创建自定义视图并将其显示给用户。通常我会说创建一个委托,但我认为 UILabel/UIView 不支持这一点。

【讨论】:

以上是关于UIView 标注气泡的主要内容,如果未能解决你的问题,请参考以下文章

ios 百度地图 点击标注出现的气泡能不能自定义

自定义标注气泡 MKMapView

自定义 iOS8 标注气泡 (Swift)

如何更改 MapView 注释中的标注气泡颜色?

像 iPod 应用一样使用 UITableView 气泡/标注

openlayers之添加Overlay 气泡标注动画 Demo (可直接运行)