UIView标注泡泡

时间:2009-12-26 10:20:52

标签: iphone uiview interface-builder

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

有人能指出我正确的方向吗?

谢谢,

3 个答案:

答案 0 :(得分:3)

我最近这样做了。

你需要两个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:方法(以确保您正在处理泡泡外的点击)。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

如果你想做可变尺寸的图像,你可能想要使用Quartz2D并绘制你需要的rects。虽然这是更多的工作,但如果做得恰当,你最终会得到一个更具扩展性的组件。

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