从OSX 10.7开始,Apple建议使用drawFocusRingMask
和focusRingMaskBounds
方法作为围绕基于NSView的对象绘制聚焦环的方法,而不是先前在10.6中的操作(在NSSetFocusRingStyle()
中使用drawRect:
)。 (请参见release notes)。
在OSX 10.10上测试:
我有一个NSTextView后代,它实现了建议的基本聚焦环图:
- (void)drawFocusRingMask {
NSRectFill([self bounds]);
}
- (NSRect)focusRingMaskBounds {
return [self bounds];
}
此NSTextView以编程方式直接添加到内容视图(没有任何滚动视图)。
这在大多数情况下效果很好,但是,当使用scaleUnitSquareToSize:缩放NSTextView时,绘制的聚焦环是完全不正确的。
因此调用:
[textView scaleUnitSquareToSize:NSMakeSize(1.5, 1.5)];
看起来像这样:
进一步向上或向下缩放会导致聚焦环矩形偏斜更大。将NSTextView的比例重置为{1.0,1.0}会导致聚焦环再次正确绘制。
我认为这是聚焦环代码中的某种错误。在调用
drawFocusRingMask
/ focusRingMaskBounds
之前,似乎在用于绘制聚焦环的图形上下文上进行了转换(内部类_NSAutomaticFocusRing
对此负责)。任何想法如何解决这个问题?我是否应该找到一种方法将上下文转换为适当的坐标(到目前为止没有成功)?还是有其他方法可以强制聚焦环正常工作?
最佳答案
覆盖drawFocusRingMask方法(通过NSTextField的子类)可以通过“手动”应用超级视图的比例因子来校正聚焦环的宽度,但是更改高度无效。我的猜测是,在缩放之前,聚焦环的高度被固定为文本大小或原始文本字段的边界。
所有这些都在系统10.7.5上。因此,当文本字段的超级视图处于缩放状态时,我只是将聚焦环关闭,直到我能找到解决方法或正确的方法。