从OSX 10.7开始,Apple建议使用 drawFocusRingMask
和 focusRingMaskBounds
方法作为基于NSView的对象绘制焦点环的方法,而不是之前在10.6中完成的方式(在 drawRect:
中使用 NSSetFocusRingStyle()
) . (见release notes) .
Tested on 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
负责此事件)之前在用于绘制聚焦环的图形上下文上进行转换 .
知道如何解决这个问题吗?我应该找到一种方法将上下文转换为适当的坐标(到目前为止没有成功)?或者还有其他方法可以强制聚焦环正常运行吗?
2 回答
覆盖drawFocusRingMask方法(通过NSTextField的子类)允许通过“手动”应用超视图的比例因子来校正聚焦环的宽度,但是改变高度不起作用 . 我的猜测是,在缩放之前,聚焦环的高度被固定到文本大小或原始文本字段边界 .
这一切都在系统10.7.5上 . 因此,当文本字段的超视图处于缩放状态时,我只是关闭聚焦环,直到我可以找出解决方法或任何正确的事情 .
我很长时间都在努力解决这个问题 . 这是一个似乎有效的解决方案:
子类
NSTextField
或NSTextView
,以便您实例化,例如ZoomableTextField
. 覆盖其drawFocusRingMask:
方法,以便覆盖不执行任何操作:然后在嵌入
ZoomableTextField
的zoomable superview中,在superview的drawRect:
方法内,调用ZoomableTextField
,drawPossibleFocus
的新方法,如下所示: