我有一个带有子图层的图层支持视图。它是更大视图的一部分。此较大视图将被删除并添加回某个视图层次结构。
当我从超级视图中删除这个较大的视图时,图层支持的视图会丢失背衬层,从而丢失所有子图层。因此,当我将所有这些添加回来时,它看起来应该不应该(缺少图层)。
我发现当-[NSView setLayer: nil]
调用时,AppKit会调用-[NSView removeFromSuperview]
:
* frame #0: 0x00000001228b4ba4 ***`***::setLayer(self=0x0000000104aa1830, cmd="setLayer:", layer=0x0000000000000000) at ****
frame #1: 0x00007fff84506244 AppKit`-[NSView _setWindow:] + 755
frame #2: 0x00007fff86a31a52 CoreFoundation`__53-[__NSArrayM enumerateObjectsWithOptions:usingBlock:]_block_invoke + 114
frame #3: 0x00007fff86a318e6 CoreFoundation`-[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 198
frame #4: 0x00007fff84da12a7 AppKit`__21-[NSView _setWindow:]_block_invoke.643 + 151
frame #5: 0x00007fff84506ae6 AppKit`-[NSView _setWindow:] + 2965
frame #6: 0x00007fff84509587 AppKit`-[NSView removeFromSuperview] + 465
知道为什么AppKit会这样做吗?有没有办法避免这种情况?
我可以覆盖-[NSView setLayer:]
而不是在那里指定nil图层,但它看起来不是一个好的解决方案。
UPD:我查看了-[NSView _setWindow:]
的代码,似乎与NSViewKeepLayersAround
偏好相关。谷歌搜索没有帮助。
0x7fff84506211 <+704>: leaq 0x1ccdc4e8(%rip), %rdi ; @"NSViewKeepLayersAround"
0x7fff84506218 <+711>: leaq 0x1cf972e4(%rip), %rdx ; sNSViewKeepLayersAroundComputedValue
0x7fff8450621f <+718>: leaq 0x381f3(%rip), %rcx ; NSViewKeepLayersAroundDefaultValueFunction
0x7fff84506226 <+725>: movl $0x1, %esi
0x7fff8450622b <+730>: callq 0x7fff844e3706 ; _NSGetBoolAppConfig
0x7fff84506230 <+735>: testb %al, %al
0x7fff84506232 <+737>: jne 0x7fff84506244 ; <+755>
0x7fff84506234 <+739>: movq 0x1cf46c4d(%rip), %rsi ; "_removeLayerIfOwnedByAppKit"
0x7fff8450623b <+746>: movq %r14, %rdi
0x7fff8450623e <+749>: callq *0x1cc50f14(%rip) ; (void *)0x00007fff9b8b7040: objc_msgSend