从OSX 10.7开始,Apple建议使用drawFocusRingMaskfocusRingMaskBounds方法作为围绕基于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上。因此,当文本字段的超级视图处于缩放状态时,我只是将聚焦环关闭,直到我能找到解决方法或正确的方法。

10-08 05:23