我想在子类 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
方法将子视图添加到此视图时,它们的布局也错误。