我一直在努力为我的菜单栏应用程序构建一个特定的外观。
我一直在使用带有NSWindow
样式掩码的NSBorderlessWindowMask
并设置[window setOpaque:NO]
和[window setBackgroundColor:[NSColor clearColor]]
。这给了我一个空白的画布,非常适合标题栏。
现在我遇到了基于视图NSTableView
我正在使用的列表问题。如何将NSTableCellView
剪切到窗口的圆角?
我开始只是自定义视图包裹NSTableView
,用圆角绘制背景。使用[view addClip:path]
不会剪辑子视图。
我也尝试使用带掩码的[view setWantsLayer:YES]
。这很有效,但桌面视图单元格会偶尔出现故障。似乎让NSScrollView
成为图层的子项是一个已知问题:
我当前的视图结构类似于:
NSWindow
- MyTitleBarView
- MyBackgroundView
- NSScrollView
- NSTableView
答案 0 :(得分:1)
我找到了一种方法:
诀窍是将窗口样式保留为默认值,而不是设置NSBorderlessWindowMask
。然后,您可以将自定义标题栏视图添加到窗口的主题框架中,如下所示:
NSView *themeFrame = [[window contentView] superview];
NSView *firstSubview = [[themeFrame subviews] objectAtIndex:0];
[titleBarView setAutoresizingMask:(NSViewMinYMargin | NSViewWidthSizable)];
[themeFrame addSubview:titleBarView positioned:NSWindowBelow relativeTo:firstSubview];
这基本上只是将您的自定义标题栏视图放在标准标题栏的顶部。您可能需要对视图框和窗口按钮进行一些重新调整。有关此问题的一些代码示例,请参阅INAppStoreWindow。
INAppStoreWindow项目表示此方法不使用任何私有API,因此可以在App Store上使用。
如果您要求窗口透明,您只需在窗口中设置以下内容:
[window setOpaque:NO];
[window setBackgroundColor:[NSColor colorWithCalibratedWhite:1.0 alpha:0.5]];