这个错误让我发疯...每次我从Xcode运行我的应用程序时,我的面板会以随机顺序绘制它的图层!即使子视图顺序完好!!
该应用是状态栏应用,当用户点击状态项时会显示简单的NSPanel
。从笔尖加载NSPanel
,我不能说我做的更多!!
我对CALayer
做了什么奇怪的事吗?绝对不是...... 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];
}
就是这样!这是与核心动画层相关的所有代码,但我勾选了IB中的复选标记为我创建图层,而不是调用-[NSView setWantsLayer:]
。
这是来自两个不同运行的日志(我删除了大部分不相关的数据):
显然,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 = ...
)
答案 0 :(得分:1)
请勿使用IB在层次结构中启用图层支持的视图,但在awakeFromNib
调用setWantsLayer:YES
答案 1 :(得分:0)
尽管我讨厌这个解决方案,但至少它有效:
NSView* view = self.contentView;
if (view.layer.sublayers[0] == self.frameView.layer)
{
NSLog(@"WTF?");
}
[view.layer addSublayer:self.frameView.layer];
代码有时会到达NSLog语句,有时则不会。无论哪种方式,最后一行确保frameView
(KMStatusPanelView
,如果您一直关注)的图层位于顶部。