使用scaleUnitSquareToSize时,在NSTextView中绘制焦点环:

时间:2014-11-18 15:18:17

标签: objective-c macos cocoa user-interface nstextview

从OSX 10.7开始,Apple建议使用drawFocusRingMaskfocusRingMaskBounds方法作为基于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];
} 

看起来像这样:

enter image description here

进一步向上或向下缩放会导致聚焦环矩形更加偏斜。将NSTextView的比例重新设置为{1.0,1.0}会使聚焦环再次正确绘制。

我认为这是焦点环代码中的某种错误。在调用[textView scaleUnitSquareToSize:NSMakeSize(1.5, 1.5)]; / drawFocusRingMask之前,它似乎在用于绘制焦点环的图形上下文上进行转换(内部类focusRingMaskBounds负责此事。)

知道怎么解决这个问题吗?我应该找到一种方法将上下文转换为正确的坐标(到目前为止没有成功)?或者还有其他方法可以强制聚焦环正常运行吗?

1 个答案:

答案 0 :(得分:0)

我长期以来一直在努力解决这个问题。这是一个似乎有效的解决方案:

NSTextFieldNSTextView进行子类化,以便您实例化,例如ZoomableTextField。覆盖其drawFocusRingMask:方法,以便覆盖不执行任何操作:

- (void)drawFocusRingMask
{
}

然后在嵌入了ZoomableTextField的zoomable superview中,在superview的drawRect:方法中,调用ZoomableTextFielddrawPossibleFocus的新方法,看起来像这样:

- (void)drawPossibleFocus
{
    NSWindow *win = [self window];
    if ([self currentEditor]==[win firstResponder] && [win isKeyWindow]) {
        [NSGraphicsContext saveGraphicsState];
        NSSetFocusRingStyle(NSFocusRingOnly);
        NSRectFill([self frame]);
        [NSGraphicsContext restoreGraphicsState];
        }
}