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

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

谁能指点我正确的方向?

谢谢,

【问题讨论】:

    标签: iphone uiview interface-builder


    【解决方案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 不支持这一点。

        【讨论】:

          猜你喜欢
          • 2011-02-01
          • 1970-01-01
          • 2015-03-19
          • 1970-01-01
          • 2010-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多