2012-04-07 5 views
1

NSBoxにフォーカスし、そのボックスのフォーカスリングを描画する方法はありますか? 私は[box drawFocusRingMask]と思った。似たようなものかもしれませんが、何も起こりません。 ボタンをクリックしたときにボックスの周りにフォーカスリングを置くだけでいいです。NSBoxフォーカスリング?

ありがとうございます。あなたが10.7にデプロイしている以降、カスタムビュークラス(NSBoxのおそらくサブクラス)を作成し、それが次のメソッドをオーバーライドすることができますと仮定

+0

NSBoxがフォーカスを持っているとはどういう意味ですか?それが受け取る重要な出来事とは何でしょうか? NSBoxをサブクラス化し、 '-acceptsFirstResponder'をオーバーライドしてYESを返すことで何かを達成できるかもしれませんが、受け取るキーイベントで何かする必要があります。 –

+0

@KenThomases私はそれがフォーカスを持っていると言ってボックスのフォーカスリングを描くことを意味しました。私はそれが必要なときに境界線の周りにフォーカスリングを描くボックスや何かが必要です。それを行う簡単な方法はありますか? NSBoxのサブクラス化とacceptsFirstResponderのオーバーライドを試みましたが、何の効果もありませんでした。 – Dennis

答えて

1

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

NSBoxをサブクラス化する場合は、使用することができます必要に応じてboundsの代わりに-borderRectを入力します。


編集:10.7以前のフォーカスリングの描画を使用することができます。また、ファーストレスポンダの変化を見て、自分自身に-setKeyboardFocusRingNeedsDisplayInRect:を起動する必要があります

-(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 ... 
} 

ビュー:あなたのような何かをするかもしれません。さらに、NSFocusRingTypeExterior-setFocusRingType:をセットアップ中に呼び出す必要があるかもしれませんが、これはスーパークラスに応じてデフォルトになる場合があります。

+0

お返事ありがとうございます。これでフォーカスリングが作成されますが、nsboxのタイトルをクリックすると作成されます。しかし、nsboxのどこかをクリックすると表示されるようにしたい(私はタイトルを持たない)。 drawFocusRingMaskを呼び出すと、nsbox全体が黒色で塗りつぶされます。タイトルがクリックされただけでなく、ボックス内のどこにでもフォーカスリングを表示する方法はありますか? – Dennis

+0

これは、フォーカスリングの動作方法ではありません。特に10.7以降では、AppKitがフォーカスリングの多くを自動的に処理します。おそらく、フォーカスリングの考え方をやめて、最初の応答者がその子孫のビューの1つであるときはいつも、(カスタムで)異なる方法で描画するカスタムビューを作成する必要があります。 –

+0

私は10.7以前のフォーカスリングの描画手法を使ったアプローチを考え、自分の答えを編集しました。 –

関連する問題