我对支持图层的 NSView 及其兄弟有一个奇怪的问题,当将它们添加到附加到旋转的超级视图的现有视图层次结构中时,它们中的一些没有正确呈现。以下是详细信息。
问题
- NSScrollView (layer can be here)
- NSClipView (or here)
- Document View (or even here)
- Some *rotated* subview
- { Problematic sublings }
因此,层次结构本身相当简单和常见:带有一些文档的滚动视图,文档子视图代表一些内容。就我而言,它是图形内容,可以旋转。旋转视图可以有一些额外的子视图——各种标记、控制点等等,一旦我使用 CALayer 作为后端,我就会遇到倾斜图形的奇怪问题:
相机图片是单独渲染的,它们不是这个视图树的一部分,注意标记和按钮。
正如您在图像上看到的,我有一些带有子视图的测试视图(只是随机按钮)。右侧的对象始终正确渲染。根据我的测试,每个带有frameRotation的NSView 都可以[0, pi/2]
渲染。左侧的对象呈现模糊,看起来该项目的缓存缓冲区太小。当frameRotation在[pi/2, pi]
范围内时会发生这种情况。
最奇怪的事
此问题不会发生在“实时轮换”中。即,如果我只是更改设置层次结构的frameRoation ,每个子视图都在它的位置,一切正常。但是,当将 subling 添加到已经旋转的对象时 - 它会出错并给出模糊的外观。
在我的应用程序中,当用户单击该项目时会出现特殊的子视图,即兄弟姐妹添加到超级视图中的那一刻。
似乎后端层有一些用于子视图的缓存缓冲区,并且当根视图旋转时,其中一些被计算为错误的大小。
它是如何实施的,我尝试了什么
- 视图非常简单和标准,我尝试推
[view setWantsLayer:YES]
送到层次结构的根视图:滚动视图、剪辑视图、文档视图,每次结果都是一样的。没有手工层,没有层主机。 - 内容视图、兄弟和实际上整个视图树(除了上面提到的视图)没有层。虽然,我尝试为各种项目打开图层但没有任何成功。
- 我试图强制更新(setNeedsDisplay)后端层没有运气
- 完全重新设置图层似乎正在工作,但很难。
解决方案?
这就是问题,其实。有人遇到过这样的问题吗?也许有人知道强制层删除所有缓存并完全更新的方法?到目前为止,我只有两个解决方案:要么完全删除图层(有效,但也转动所有的眼睛糖果),或者重新设置图层调用setWantsLayer:NO
,然后setWantsLayer:YES
. 这个性能很差。