2013-06-21 40 views
0

我想在子类NSView外创建聚焦环以识别选择。我的参考文献来自这里:Link绘制聚焦环后,子类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:




它的工作和正确生成视图外的聚焦环。然而,很快就发生一个问题:

http://oi39.tinypic.com/2s846jo.jpg

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

下面是当不点击子类的视图的情况(看起来很好):

http://oi42.tinypic.com/2urqcmf.jpg

然后在图像上单击(产生的对焦环,但...):

http://oi40.tinypic.com/33ldtfa.jpg

我试着调整窗口的大小,事情变得更加可悲的是“搞笑”:

http://oi43.tinypic.com/25pshub.jpg

我不明白为什么问题是或如何解决。任何人都可以帮助我吗?我在这里上传我的示例代码:Download


很伤心,没有人回答这个问题。

我注意到当子视图被-addSubview:-setFrame方法添加到这个视图时,它们也错误地进行了布置。

+0

@ H2CO3我对为什么要移除标签“xcode”有点好奇吗? –

+0

,因为这不是一个Xcode的问题。在使用它之前,应该阅读标签的描述(“标签维基”) - “xcode”的标签维基说:“它不应该用于一般的iOS和OS X编程问题”。 – 2013-06-21 12:27:34

回答

1

真的晚了答案,但在这里它是无论如何:你没有在if (_shouldDisplayFocus) {块开始叫[NSGraphicsContext saveGraphicsState]

您致电[NSGraphicsContext restoreGraphicsState]将图形状态从堆栈中弹出,但是您从不在堆栈上放置任何东西。 Cocoa正在使用图形状态堆栈来绘制所有东西,以便弹出一些与图像位置有关的未知状态。如果您想要添加对焦环风格并能够移除对焦环风格,则需要先保存图形状态,然后将对焦环风格设置为任何需要的方式,然后将图形状态恢复为原来的状态。