图层支持NSView旋转和倾斜的兄弟姐妹
我有一个与层支持的NSView和它的兄弟姐妹的一个奇怪的问题,其中一些添加到旋转的超级视图附加到现有的视图层次结构时不正确。 以下是详细信息。
问题
- NSScrollView (layer can be here) - NSClipView (or here) - Document View (or even here) - Some *rotated* subview - { Problematic sublings }
所以,层次结构本身是相当简单和普遍的:带有一些文档的滚动视图,文档子视图代表一些内容。 在我的情况下,它的graphics内容,它可以旋转。 旋转的视图可以有一些额外的子视图 – 各种标记,控制点等等,这就是我使用CALayer作为后端时遇到的歪斜graphics的奇怪问题:
相机图片被分开渲染,它们不是这个视图树的一部分,注意标记和button。
正如你可以在图像上看到的,我有一些testing视图与子视图(只是随机button)。 总是呈现正确的对象。 根据我的testing, frameRotation在[0, pi/2]
之间的每个NSView都呈现OK。 左侧的对象呈现模糊,看起来像这个项目的caching缓冲区太小。 当frameRotation处于[pi/2, pi]
范围时,会发生这种情况。
最奇怪的事情
这个问题在“实时轮换”中不会发生。 也就是说,如果我只是改变了设置层次结构的框架 ,每个子视图就位,一切正常。 然而, 当subling被添加到已经旋转的对象时 ,它会出现错误,并给出这个模糊的外观。
在我的应用程序中,当用户点击该项目时,会出现一个特殊的子视图,那就是当兄弟被添加到超级视图的那一刻。
看起来后端图层有一些子视图的caching缓冲区,并且当根视图旋转时,它们中的一些计算的大小错误。
它是如何实施的,我试过了什么
- 视图是相当简单和标准的,我试图推动
[view setWantsLayer:YES]
到层次结构的根视图:滚动视图,剪辑视图,文档视图,每个结果是相同的。 没有手工制作的图层,没有图层的主机。 - 内容视图,兄弟和实际上整个视图树(除了上面提到的视图)没有层。 虽然,我试图把各个层面上的图层都没有成功。
- 我试图强制更新(setNeedsDisplay)后端层没有运气
- 完全重新设置图层似乎正在工作,但很难。
解决scheme?
实际上这是个问题。 有没有人遇到这样的问题? 也许有人知道如何迫使图层放下所有caching并完全更新? 到目前为止,我只有两个解决scheme:要么完全删除图层(工作,但所有的眼睛糖果以及),或重新设置图层调用setWantsLayer:NO
后面setWantsLayer:YES
。 这一个有可怕的performance。
你写过,你尝试过“setNeedsDisplay”。 你是从主线程调用这个方法吗? 在我的一个应用程序中,如果从另一个线程调用setNeedsDisplay,则什么都不会发生。 如果你想确保显示无效,那么使用dispatch如下所示:
dispatch_async(dispatch_get_main_queue(), ^{ [view setNeedsDisplay:YES]; });
另外看看你的IB检查员。 有时层支持的视图不喜欢与非层支持的视图混合。 确保在“视图效果检查器”图层支持已打开您的根层的所有子视图。
(在我的程序中,如果图层支持被closures,NSButtons会消失)