【问题标题】:NSBox Focus Ring?NSBox 对焦环?
【发布时间】:2012-04-07 07:22:13
【问题描述】:

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

提前致谢。

【问题讨论】:

  • NSBox 有焦点是什么意思?它将如何处理它将收到的关键事件?您可以通过继承 NSBox 并覆盖 -acceptsFirstResponder 以返回 YES 来实现某些目标,但是您必须对收到的关键事件做一些事情。
  • @KenThomases 我的意思是在说它有焦点时为框画焦点环。我只需要一个盒子或其他可以在我需要时在边框周围绘制焦点环的东西。有没有简单的方法来做到这一点?我尝试继承 NSBox 并覆盖 AcceptFirstResponder 但它没有任何效果。

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


【解决方案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:,尽管这可能是默认设置,具体取决于超类。

【讨论】:

  • 感谢您的回复。它现在创建了一个焦点环,但它仅在我单击 nsbox 的标题时创建。但是,我希望在单击 nsbox 内的任何位置时显示它(我不会有标题)。如果我调用 drawFocusRingMask,它会用黑色填充整个 nsbox。有没有办法不仅在单击标题时显示焦点环,而且在框内的任何位置显示焦点环?
  • 对焦环不是这样工作的。特别是在 10.7 及更高版本中,AppKit 会自动处理更多的对焦环内容。也许您应该停止考虑焦点环,并制作一个自定义视图,当第一响应者是其后代视图之一时,它会以不同的方式(以自定义方式)绘制自己。
  • 我想到了一种使用 10.7 之前的焦点环绘制技术的方法并编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多