2012-04-07 74 views
1

有没有办法专注于NSBox并绘制该框的对焦环? 我以为[box drawFocusRingMask];可能是类似的东西,但没有任何反应。 我只需要一个盒子在按钮被点击时在其周围有一个对焦环。NSBox聚焦环?

在此先感谢。

+0

NSBox对焦点有什么意义?它将会收到什么关键事件?你可以通过继承NSBox和覆盖'-acceptsFirstResponder'来返回YES来实现某些功能,但是你必须对接收到的关键事件做些什么。 – 2012-04-07 08:24:13

+0

@KenThomases我打算为这个盒子画焦点环时说出它的焦点。我只需要一个盒子或其他东西,当我需要时可以在边框上画一个对焦环。有没有简单的方法来做到这一点?我尝试了继承NSBox并覆盖acceptFirstResponder,但没有任何效果。 – Dennis 2012-04-07 08:39:42

回答

1

假设你部署到10.7或更高版本,你可以做一个自定义的视图类(也许NSBox的子类),并用它覆盖下面的方法:

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 
- (void)drawFocusRingMask { 
    NSRectFill([self bounds]); 
} 
- (NSRect)focusRingMaskBounds { 
    return [self bounds]; 
} 

如果继承NSBox,您可以使用如果您愿意,可以使用-borderRect而不是bounds


编辑:您可能可以使用10.7款之前的对焦环画。你可以这样做:

-(void)drawRect:(NSRect)rect 
{ 
    NSResponder* fr = [[self window] firstResponder]; 
    if ([fr isKindOfClass:[NSView class]] && [(NSView*)fr isDescendantOf:self]) 
    { 
     [NSGraphicsContext saveGraphicsState]; 
     NSSetFocusRingStyle(NSFocusRingOnly); 
     [[NSBezierPath bezierPathWithRect:NSInsetRect([self bounds],4,4)] fill]; 
     [NSGraphicsContext restoreGraphicsState]; 
    } 
    // ... normal drawing, possibly invoking super ... 
} 

的观点也必须留意在第一响应变化和自身调用-setKeyboardFocusRingNeedsDisplayInRect:。另外,可能需要在NSFocusRingTypeExterior的设置过程中自行拨打-setFocusRingType:,虽然这可能是默认设置,具体取决于超类。

+0

感谢您的回复。它现在创建一个聚焦环,但它只在点击nsbox的标题时创建。但是,我希望在点击nsbox内的任何位置时显示它(我不会有标题)。如果我调用drawFocusRingMask,它会用黑色填充整个nsbox。有没有一种方法可以显示对焦环,而不仅仅是当标题被点击时,但盒子内的任何位置? – Dennis 2012-04-07 22:13:56

+0

这不是聚焦环的工作原理。特别是在10.7及更高版本中,AppKit会自动处理更多的对焦环内容。也许你应该停止思考一个聚焦环,并创建一个自定义视图,当第一个响应者是其后代视图时,以不同的方式绘制自己的视图(以自定义的方式)。 – 2012-04-08 07:25:34

+0

我想到了一种使用10.7之前的对焦环画技术并编辑了我的答案的方法。 – 2012-04-08 07:39:24