NSWindow何时获得圆角?

6
自从OS X Lion开始,标准窗口就有了圆角。不幸的是,我在我的应用程序中复制这个效果时遇到了麻烦。当一个NSView被推到一个NSWindow的边角时,有时它会保留圆形NSWindow并且有时它会逃脱并成为一个方形的角。
我还没有找到规律。
一些"绘制它们背景"的NSViews有时强制要求正方形的角,所以不是这个问题。我的自定义NSViews也有方形的角(如果我靠近边缘,我是否有责任检查我的位置并将其剪切掉?),但有些标准Cocoa控件也会这样做。
例如,在一个新的Cocoa项目中,将一个(滚动)NSTableView或NSTextView放在主NSWindow中,并添加布局约束,以便它跟随窗口的边缘。底部角是方形的!相比之下,Finder有一个(看起来像)NSTableView,紧贴窗口的底角,而且是圆形的。
如何使一个普通的NSWindow,在底部拥有正确的圆角呢?

我的建议是展示你尝试过的代码,也许这样别人就可以帮助你确定需要做出哪些不同的改变。 - l'L'l
没有任何代码。我在最后一段中描述了设置。新建Cocoa应用程序,在窗口中添加NSTableView或NSTextView,然后运行。 - J. Cocoe
是的,这就是我感到困惑的原因。OS X中的每个窗口都有圆角。在Xcode中执行默认操作会给我方形边角。为什么?有哪些文档说明了应该如何工作? - J. Cocoe
不,NSTexturedBackgroundWindowMask是在10.2中添加的,在10.7开始默认给窗口加圆角之前已经有了9年的历史,而且它的文档已经非常过时了。在10.11中,这个位会改变纹理,但是无论是否使用它,一个空的默认NSWindow都有圆角。 - J. Cocoe
这个问题在我看来似乎完全没有问题;我点赞以弥补那个踩的。我用Xcode中的一个新项目,在没有任何代码的情况下,大约10秒钟就复制了这个问题,正如J. Cocoe所说:将文本视图设置到窗口的角落确实会使角落变成方形,并且阴影也有缺陷。Apple的TextEdit应用程序没有出现这个问题,因此可能有些问题。无论窗口是否设置为纹理(即NSTexturedBackgroundWindowMask),问题都会发生,因此这是一个无关紧要的错误线索。 - bhaller
显示剩余5条评论
1个回答

11
为了让NSWindow裁剪其内容以适应其实际的窗口边框(为什么这不是默认设置?),需要设置一个标志,该标志是NSView的"wantsLayer"。
  • 在代码中:窗口加载时,使用contentView!.wantsLayer = true

  • 或者在IB中:选择窗口的根视图,然后在“视图效果检查器”中,在“Core Animation Layer”旁边的框中选中它(即使您没有使用核心动画)。

元数据:关于"wantsLayer"的文档讨论了很多复杂的事情,似乎与窗口形状或裁剪毫不相关。而且它甚至不是NSWindow的属性,而NSWindow具有一些旗帜声称是关于窗口角落修整,但它们已经不再起作用了,所以我不知道任何人是如何发现这个问题的,除非是花费两天时间进行试错。希望这个答案能帮助其他人!

这解决了我多年的问题。现在我可以将 NSTextView 放在 NSWindow 底部而不必担心角落渲染了...! - eonil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接