0

我想在子类 NSView 之外创建一个焦点环来识别选择。我的参考来自这里:Link

我按照参考,将-drawRect方法重写为:

@property (nonatomic) BOOL shouldDisplayFocus;
...

- (void)drawRect:(NSRect)dirtyRect
{
// Drawing code here.
if (_shouldDisplayFocus)
{
    [self setKeyboardFocusRingNeedsDisplayInRect:[self bounds]];
}

[super drawRect:dirtyRect];
[[NSColor blackColor] set];
NSRectFill(dirtyRect);

if (_shouldDisplayFocus)
{
    NSSetFocusRingStyle(NSFocusRingTypeExterior);
    NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSInsetRect([self bounds], -1.0, -1.0)];
    [[NSColor blackColor] set];
    [path stroke];

    [NSGraphicsContext restoreGraphicsState];
}
}

并且它的-mouseDown:方法也被覆盖了:

- (void)mouseDown:(NSEvent *)theEvent
{
[super mouseDown:theEvent];
if (_delegate && [_delegate respondsToSelector:@selector(mouseDownAtView:withEvent:)])
{
    [_delegate mouseDownAtView:self withEvent:theEvent];
}
}

单击视图后,其代表将设置/取消设置焦点环,这将-drawRect:再次调用它。




它可以正常工作并在视图外正确生成对焦环。然而,很快就出现了一个问题:

我在子类视图中有一个图像视图。由于图像视图矩形是使用 NSLayoutConstraint 对象自动布局的,因此我创建了四个 NSLayoutConstraint 插座来调整它们的值。我不经常更改布局约束。实际上,由于图像大小保持不变,我不会设置它们。

这是未单击子类视图的情况(似乎很好):

然后点击图片(对焦环生成了,但是……):

我尝试调整窗口大小,事情变得更加可悲“有趣”:

我不明白为什么会出现问题或如何解决。有人可以帮我吗?我在这里上传了我的示例代码:下载


很遗憾没有人回答这个问题。

我注意到当通过-addSubview:and-setFrame方法将子视图添加到此视图时,它们的布局也错误。

4

1 回答 1

2

真的很晚的答案,但无论如何都在这里:你没有[NSGraphicsContext saveGraphicsState]if (_shouldDisplayFocus) {街区开始时打电话。

您调用[NSGraphicsContext restoreGraphicsState]将图形状态从堆栈中弹出,但您从未将任何内容放入堆栈。Cocoa 使用图形状态堆栈来绘制所有内容,因此您正在弹出一些与图像位置有关的未知状态。如果您想添加对焦环样式并能够移除对焦环样式,您需要先保存图形状态,将对焦环样式设置为您想要的任何样式,然后将图形状态恢复为原来的状态。

于 2016-07-12T03:50:33.710 回答