このバグは私を夢中にさせています... Xcode からアプリを実行するたびに、パネルはレイヤーをランダムな順序で描画します! サブビューの順序はそのままですが!!
NSPanel
このアプリは、ユーザーがステータス アイテムをクリックするとシンプルなステータス バー アプリを表示するアプリです。はNSPanel
ペン先からロードされており、それ以上のことはできません!!
私はCALayer
sで何か変なことをしていますか?絶対にありません...私が持ってKMStatusPanelView
いるのはオーバーライドされたものだけ-[NSView drawRect:]
です。KMRootView
には次のものがあります。
KMRootVC
のビュー コントローラである には、次のKMRootView
ものがあります。
- (void)awakeFromNib
{
[super awakeFromNib];
NSAssert(self.view.layer, @"Layer not created");
[self.view.layer setCornerRadius:18.0];
[self _loadControllerAtIndex:0];
}
.. でKMRootView
、私はオーバーライド-[NSView drawRect:]
し、以下も持っています:
- (void)awakeFromNib
{
[super awakeFromNib];
NSAssert(self.layer, @"Layer not found");
[self.layer setMasksToBounds:YES];
}
それでおしまい!コア アニメーション レイヤーに関連するコードはこれですべてです。ただし、-[NSView setWantsLayer:]
.
これは 2 つの異なる実行からのログです (無関係なデータのほとんどを削除しました):出力からわかるように、
明らかに、一番下にあるはずです。KMRootView
-[NSView subviews]
正しい結果で実行します。
$2 = 0x000000010029b260 <__NSArrayM 0x10029b260>(
<KMRootView: 0x10029c400>,
<KMStatusPanelView: 0x100248a30>
)
(lldb) po [[[self.window contentView] layer] sublayers]
$3 = 0x0000000100264e50 <CALayerArray 0x100264e50>(
<_NSViewBackingLayer:...; bounds = CGRect (0 0; 320 480); delegate = <KMRootView: 0x10029c400>; sublayers =...,
<_NSViewBackingLayer:...; bounds = CGRect (0 0; 320 488); delegate = <KMStatusPanelView: 0x100248a30>;...
)
めちゃくちゃな結果で実行します。
$0 = 0x000000010023aa40 <__NSArrayM 0x10023aa40>(
<KMRootView: 0x102430f70>,
<KMStatusPanelView: 0x102430660>
)
(lldb) po [[[self.window contentView] layer] sublayers]
$1 = 0x000000010242d2c0 <CALayerArray 0x10242d2c0>(
<_NSViewBackingLayer:...; bounds = CGRect (0 0; 320 488); delegate = <KMStatusPanelView: 0x102430660>;...,
<_NSViewBackingLayer:...; bounds = CGRect (0 0; 320 480); delegate = <KMRootView: 0x102430f70>; sublayers = ...
)