首页 文章

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

提问于
浏览
1

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

看起来像这样:

enter image description here

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

我认为这是焦点环代码中的某种错误 . 它似乎在调用 drawFocusRingMask / focusRingMaskBounds (内部类 _NSAutomaticFocusRing 负责此事件)之前在用于绘制聚焦环的图形上下文上进行转换 .

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

2 回答

  • 0

    覆盖drawFocusRingMask方法(通过NSTextField的子类)允许通过“手动”应用超视图的比例因子来校正聚焦环的宽度,但是改变高度不起作用 . 我的猜测是,在缩放之前,聚焦环的高度被固定到文本大小或原始文本字段边界 .

    这一切都在系统10.7.5上 . 因此,当文本字段的超视图处于缩放状态时,我只是关闭聚焦环,直到我可以找出解决方法或任何正确的事情 .

  • 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];
            }
    }
    

相关问题