【问题标题】:Annotating over an NSImageView with CALayers, layer-hosting or layer-backed?使用 CALayers、图层托管或图层支持在 NSImageView 上进行注释?
【发布时间】:2013-07-04 20:36:52
【问题描述】:

我想用CALayerNSImageView 进行注释。目的是能够在图像上绘制一个形状(CALayer),并在单独的视图中显示有关已突出显示的区域的信息。例如,用户可以在图像视图上绘制一个矩形,该区域下的像素可以被放大并显示在另一个窗口中。

我想要一些关于使用CALayer 在图像视图顶部进行绘图的最佳方法的一般建议。如果调整视图大小,我希望选择区域的位置保持同步,即相对于图像的位置应保持不变。

我有点困惑,因为 CALayer 文档声明了 layer-backed views

  • “当使用 layer-backed view 时,你不应该直接与 layer 交互。相反,你必须使用标准的 view 编程实践。”

    显然这不是合适的选择,因为我想拥有该层并直接与之交互。

对于层托管视图

  • “当使用 layer-hosting view 时,你不应该依赖 view 进行绘图,也不应该在 layer-hosting view 中添加子视图。”

    所以看起来视图应该是层托管的。但是,使我的 NSImageView(子类)层托管会阻止图像绘制,因为NSImageView 依赖(我假设)-drawRect:-drawRect: 不使用层托管视图调用。它还希望在视图为空时在视图中进行一些自定义绘图,例如占位符消息,为此我需要-drawRect:

因此,一种可能的解决方案是在 Interface Builder 中在图像视图上方放置一个“注释视图”,即它们不是嵌套的,而是简单地占据相同的空间并具有相同的大小。我可以在 Interface Builder 中指定 z 顺序,因此注释视图始终位于顶部。然后我将注释视图设置为图层托管,并保持图像视图不变。

这似乎是一种 hack,所以我确信有更好的方法。当然,我可以在图像视图-drawRect: 中绘制注释,但这会添加大量代码,我不想在没有探索替代方案的情况下立即这样做。

【问题讨论】:

    标签: xcode macos cocoa core-animation


    【解决方案1】:

    我寻求的解决方案是根本不改变 NSImageView 子类的层。相反,我向 NSImageView 子类添加了一个子视图,限制了视图,使其与父视图具有相同的边界,然后使这个子视图成为图层托管。然后可以将子层添加到这个“注释”视图的层。通过这种方式,我可以在 NSImageView 上进行注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多