为什么 - AppKit调用[NSView setLayer:nil]?

时间:2017-09-01 20:52:59

标签: macos cocoa calayer nsview appkit

我有一个带有子图层的图层支持视图。它是更大视图的一部分。此较大视图将被删除并添加回某个视图层次结构。

当我从超级视图中删除这个较大的视图时,图层支持的视图会丢失背衬层,从而丢失所有子图层。因此,当我将所有这些添加回来时,它看起来应该不应该(缺少图层)。

我发现当-[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

0 个答案:

没有答案