从OSX 10.7开始,Apple建议使用drawFocusRingMask
和focusRingMaskBounds
方法作为基于NSView的对象绘制焦点环的方式,而不是之前在10.6中完成的方式(使用{{1}在NSSetFocusRingStyle()
)。 (见release notes)。
在OSX 10.10上测试:
我有一个NSTextView后代,它按照建议实现基本的聚焦环绘图:
drawRect:
此NSTextView以编程方式直接添加到内容视图(没有任何滚动视图)。
这在大多数情况下效果很好,但是,当使用scaleUnitSquareToSize:缩放NSTextView时,绘制的对焦环完全不正确。
所以打电话:
- (void)drawFocusRingMask {
NSRectFill([self bounds]);
}
- (NSRect)focusRingMaskBounds {
return [self bounds];
}
看起来像这样:
进一步向上或向下缩放会导致聚焦环矩形更加偏斜。将NSTextView的比例重新设置为{1.0,1.0}会使聚焦环再次正确绘制。
我认为这是焦点环代码中的某种错误。在调用[textView scaleUnitSquareToSize:NSMakeSize(1.5, 1.5)];
/ drawFocusRingMask
之前,它似乎在用于绘制焦点环的图形上下文上进行转换(内部类focusRingMaskBounds
负责此事。)
知道怎么解决这个问题吗?我应该找到一种方法将上下文转换为正确的坐标(到目前为止没有成功)?或者还有其他方法可以强制聚焦环正常运行吗?
答案 0 :(得分:0)
我长期以来一直在努力解决这个问题。这是一个似乎有效的解决方案:
对NSTextField
或NSTextView
进行子类化,以便您实例化,例如ZoomableTextField
。覆盖其drawFocusRingMask:
方法,以便覆盖不执行任何操作:
- (void)drawFocusRingMask
{
}
然后在嵌入了ZoomableTextField
的zoomable superview中,在superview的drawRect:
方法中,调用ZoomableTextField
,drawPossibleFocus
的新方法,看起来像这样:
- (void)drawPossibleFocus
{
NSWindow *win = [self window];
if ([self currentEditor]==[win firstResponder] && [win isKeyWindow]) {
[NSGraphicsContext saveGraphicsState];
NSSetFocusRingStyle(NSFocusRingOnly);
NSRectFill([self frame]);
[NSGraphicsContext restoreGraphicsState];
}
}