Macos 绘制聚焦环后,子类NSView的子视图重新定位错误

Macos 绘制聚焦环后,子类NSView的子视图重新定位错误,macos,nsview,autolayout,nsimageview,Macos,Nsview,Autolayout,Nsimageview,我想在子类NSView外创建一个焦点环,以识别所选内容。我的推荐信来自这里: 我遵循参考,将-drawRect方法改写为: @property (nonatomic) BOOL shouldDisplayFocus; ... - (void)drawRect:(NSRect)dirtyRect { // Drawing code here. if (_shouldDisplayFocus) { [self setKeyboardFocusRingNeedsDisplayInRect:[

我想在子类NSView外创建一个焦点环,以识别所选内容。我的推荐信来自这里:

我遵循参考,将
-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:
-setFrame
方法将子视图添加到此视图时,子视图的布局也不正确。

回答得很晚,但无论如何,这里是这样的:您没有在
if(\u shouldldisplayfocus){/code>块开始时调用
[NSGraphicsContext saveGraphicsState]


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

@H2CO3我有点好奇为什么要删除标记“xcode”?因为这不是一个xcode问题。值得阅读描述(“标记wiki”)在使用标签之前,先对标签进行修改。
xcode
的标签wiki说,“它不应该用于一般的iOS和OSX编程问题”。