7

我一直在尝试为我的菜单栏应用程序构建一个特定的外观。

在此处输入图像描述

我一直在使用NSWindow带有NSBorderlessWindowMask样式蒙版和设置的 a[window setOpaque:NO][window setBackgroundColor:[NSColor clearColor]]. 这给了我一个空白画布,非常适合标题栏。

现在我在NSTableView用于列表的基于视图的问题上遇到了问题。如何将NSTableCellViews 剪辑到窗口的圆角?

我开始只是有一个自定义视图包裹NSTableView,用圆角绘制背景。虽然使用[view addClip:path]不会剪辑子视图。

我也试过用[view setWantsLayer:YES]带面具的。这很好用,但表格视图单元格会偶尔出现故障。似乎拥有NSScrollView一个层的子层是一个已知问题:

http://i.stack.imgur.com/JmhjD.png

我当前的视图结构看起来像:

NSWindow
- MyTitleBarView
- MyBackgroundView
  - NSScrollView
    - NSTableView
4

1 回答 1

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]];
于 2012-07-28T11:16:01.513 回答