我有一个奇怪的问题,支持图层的NSView及其兄弟,当添加到附加到旋转的超视图的现有视图层次结构中时,其中一些不能正确呈现。以下是详细信息。
- NSScrollView (layer can be here)
- NSClipView (or here)
- Document View (or even here)
- Some *rotated* subview
- { Problematic sublings }
因此,层次结构本身相当简单和常见:带有一些文档的滚动视图,文档子视图代表一些内容。就我而言,它是图形内容,可以旋转。旋转视图可以有一些额外的子视图 - 各种标记,控制点等等,一旦我使用CALayer作为后端,我就会遇到偏斜图形的奇怪问题:
相机照片分别以呈现,它们不是此视图树的一部分,请注意标记和按钮。
正如您在图像上看到的,我有一些带有子视图的测试视图(只是随机按钮)。始终正确呈现右侧的对象。根据我的测试,[0, pi/2]
之间的每个NSView与 frameRotation 呈现正常。渲染左侧的对象
模糊,看起来这个项目的缓存缓冲区太小。当 frameRotation 处于[pi/2, pi]
范围内时会发生这种情况。
“实时轮换”中不会发生此问题。即如果我只是更改设置层次结构的 frameRoation ,每个子视图就在它的位置,一切正常。但是,将subling添加到已经旋转的对象时 - 它会出现错误并使其模糊不清。
在我的应用程序中,当用户点击该项目时,会出现特殊子视图,即“兄弟姐妹被添加到超级视图中的那一刻。”
看起来后端层有一些用于子视图的缓存缓冲区,并且当根视图旋转时,其中一些缓冲区的计算大小错误。
[view
setWantsLayer:YES]
推送到层次结构的根视图:滚动视图,
剪辑视图,文档视图,每个结果都是一样的。没有
手工制作的图层,没有图层主机。setWantsLayer:NO
后跟setWantsLayer:YES
的图层。这个表现糟糕。
答案 0 :(得分:1)
您已经写过您尝试了#set; setNeedsDisplay"。你是从主线程调用这个方法吗?在我的一个应用程序中,如果我从另一个线程调用setNeedsDisplay,则没有任何反应。如果要确保显示无效,请使用如下调度:
dispatch_async(dispatch_get_main_queue(), ^{
[view setNeedsDisplay:YES];
});
另外请查看您的IB检查员。有时,图层支持的视图不喜欢与非图层支持的视图混合。确保在" View Effects Inspector"为根层的所有子视图启用了图层支持。
(在我的程序中,如果关闭图层支持,NSButton有时会消失)