窗口的contentView具有NSTextFields。 (苹果系统)

我正在使用界面构建器来设置窗口及其功能,因此awakeFromNib中除了此以外没有其他功能:

[[self.window contentView] setWantsLayer:YES];
CALayer *layer = [[self.window contentView] layer];
CGColorRef lightGray = CGColorCreateGenericGray(0.93, 1.0);
[layer setBackgroundColor:lightGray];
CGColorRelease(lightGray);

但是,在textField的边界之外看不到textField的聚焦环。

带层:

没有层:

我在想这个显示问题比这个要大,但是我找不到这个问题的示例(和解决方案)。

任何人?

最佳答案

这是一个长期存在的问题-在2008年的Cocoa-dev邮件列表中有一个mention。聚焦环实际上是在 View 框架之外绘制的。允许使用NSView绘图执行此操作,但是它不适用于CALayers。尽管Leopard AppKit release notes中有一个希望的注解,称为 View ,聚焦环和绘图性能,但这并没有改变。

从理论上讲,可以绕过文本字段的图层框架并添加一些填充以使聚焦环完全显示。但是,我只是尝试过这种方法,看来,至少对于NSTextField,它不会在更改的框架内整齐地绘制。不过,请尝试一下-我花了很长时间没有大惊小怪。 (聚焦环在每个方向上都从框架向外延伸了4个像素。)

请注意,从技术上讲,您正在破坏层支持的规则,这可能是您遇到困难的部分原因。从 NSView setWantsLayer: docs:



您正在使用层支持的 View 并更改其背景。您可以通过制作自己的图层来解决此问题,但是:



排除了将文本字段放入 View 的可能性。

(如果需要,请参阅此SO问题:Difference Between Layer-Backed and Layer-Hosting Views?)

10-07 21:30