【问题标题】:How to fix focus ring's highlight being clipped when using CALayer?使用CALayer时如何解决对焦环高光被剪切的问题?
【发布时间】:2011-03-06 01:06:29
【问题描述】:

窗口的 contentView 有 NSTextFields。 (MacOS)

我正在使用界面生成器来设置窗口及其功能,所以在 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 范围之外是不可见的。

带层:

没有图层:

我认为这个显示问题比这更大,但我找不到这个问题的示例(和解决方案)。

有人吗?

【问题讨论】:

    标签: objective-c cocoa core-animation nstextfield


    【解决方案1】:

    这是一个众所周知的问题——早在 2008 年,Cocoa-dev 邮件列表上有一个mention。焦点环实际上是在其视图框架外部绘制的。 NSView 绘图允许这样做,但它不适用于 CALayers。尽管Leopard AppKit release notes 中有一个充满希望的注释,称为Views、Focus Rings 和 Drawing Performance,但这并没有改变。

    理论上,可以随意调整文本字段的图层框架并添加一些填充以使对焦环充分显示。但是,我刚刚尝试过这个,似乎至少对于 NSTextField 来说,它不会在更改的框架内整齐地绘制。不过,试一试——我并没有大惊小怪太久。 (对焦环在每个方向上从画面中伸出 4 个像素。)

    请注意,您在技术上违反了基于层的规则,这可能是您遇到困难的部分原因。来自NSView setWantsLayer: docs:

    当使用图层支持的视图时,您不应该直接与图层交互。

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

    当使用 layer-hosting view 时,你不应该依赖 view 进行绘图,也不应该向 layer-hosting view 添加子视图。

    这排除了在视图中放置文本字段的可能性。

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

    【讨论】:

    • 感谢 josh,感谢您对焦点环问题最有帮助的回答,同时也扩展了我对 layer-backed v. layer-hosting 差异的理解。我将继承 NSView 以获得我想要的背景处理。我确实认为使用图层是一种无需子类化即可自定义视图背景的合适方法。感谢您清除它。
    • 很高兴它有帮助。祝你好运!
    • 为了记录,对焦环问题似乎在小牛队中得到了修复。 (我用大纲视图而不是文本字段进行了测试,但我猜这是同一个错误。)
    • 感谢@JWWalker 的留言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2021-03-05
    相关资源
    最近更新 更多