微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

objective-c – 如何在使用CALayer时修复聚焦环的高光被剪裁?

窗口的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.焦点环实际上被绘制在它的视图框架之外.允许NSView绘图执行此操作,但它不适用于CALayers.尽管在 Leopard AppKit release notes中有一个充满希望的音符,名为“视觉”,“聚焦环”和“绘画表演”,但这并没有改变.

从理论上讲,可以使用文本字段的“图层”框架,并添加一些填充以使聚焦环完全显示.但是,我刚试过这个,似乎至少对于NSTextField来说,它不会在一个改变的帧内整齐地绘制.不过尝试一下 – 我没有长时间大惊小怪. (聚焦环在每个方向上从帧中伸出4个像素.)

就像一个注释,你在技术上打破了层支持的规则,这可能是你遇到困难的部分原因.从NSView setWantsLayer: docs

When using layer-backed views you should never interact directly with the layer.

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

When using a layer-hosting view you should not rely on the view for drawing,nor should you add subviews to the layer-hosting view.

它排除了在视图中放置文本字段.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐