我想对NSImageView
CALayer
进行注释。目的是能够在图像上绘制形状(CALayer
),并在单独的视图中显示有关已突出显示的区域的信息。例如,用户可以在图像视图上绘制矩形,并且可以放大该区域下的像素并在另一个窗口中显示。
我想了解一下使用CALayer
在图像视图顶部实现绘图的最佳方法的一般建议。如果调整视图大小,我希望选择区域的位置保持同步,即相对于图像的位置应保持不变。
我有点困惑,因为CALayer文档说明图层支持的视图,
“使用图层支持的视图时,不应直接与图层交互。而是必须使用标准的视图编程实践。”
显然,这不是一个合适的选择,因为我想拥有该图层并直接与它互动。
对于图层托管视图,
“使用图层托管视图时,不应依赖视图进行绘制,也不应将子视图添加到图层托管视图。”
所以看起来该视图应该是图层托管。但是,使我的NSImageView(子类)图层托管会阻止图像绘制,因为NSImageView
依赖于(我假设)-drawRect:
。不使用图层托管视图调用-drawRect:
。它还希望在视图为空时在视图中进行一些自定义绘制,例如占位符消息,我需要-drawRect:
。
因此,一种可能的解决方案是在Interface Builder中在图像视图上方放置一个“注释视图”,即它们不是嵌套的,而只是占据相同的空间并具有相同的大小。我可以在Interface Builder中指定z排序,因此注释视图始终位于顶部。然后我将注释视图设置为图层托管,并保持图像视图不变。
这看起来像是一个黑客,所以我相信有更好的方法。当然,我可以在图像视图-drawRect:
中绘制注释,但这会添加大量代码,我不想立即这样做而不去探索替代方案。
答案 0 :(得分:1)
我采用的解决方案是根本不改变NSImageView子类的层。相反,我向NSImageView子类添加了一个子视图,约束了视图,使其与父节点具有相同的边界,然后使该子视图层托管。然后可以将子图层添加到此“注释”视图的图层中。通过这种方式,我可以在NSImageView上进行注释。