NSBox聚焦环?

时间:2012-04-07 07:22:14

标签: objective-c xcode cocoa user-interface osx-lion

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

提前致谢。

1 个答案:

答案 0 :(得分: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:。另外,在使用-setFocusRingType:进行设置时,可能需要自行调用NSFocusRingTypeExterior,尽管这可能是默认值,具体取决于超类。