NSBoxにフォーカスし、そのボックスのフォーカスリングを描画する方法はありますか? 私は[box drawFocusRingMask]と思った。似たようなものかもしれませんが、何も起こりません。 ボタンをクリックしたときにボックスの周りにフォーカスリングを置くだけでいいです。NSBoxフォーカスリング?
ありがとうございます。あなたが10.7にデプロイしている以降、カスタムビュークラス(NSBoxのおそらくサブクラス)を作成し、それが次のメソッドをオーバーライドすることができますと仮定
NSBoxにフォーカスし、そのボックスのフォーカスリングを描画する方法はありますか? 私は[box drawFocusRingMask]と思った。似たようなものかもしれませんが、何も起こりません。 ボタンをクリックしたときにボックスの周りにフォーカスリングを置くだけでいいです。NSBoxフォーカスリング?
ありがとうございます。あなたが10.7にデプロイしている以降、カスタムビュークラス(NSBoxのおそらくサブクラス)を作成し、それが次のメソッドをオーバーライドすることができますと仮定
:
- (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:
をセットアップ中に呼び出す必要があるかもしれませんが、これはスーパークラスに応じてデフォルトになる場合があります。
お返事ありがとうございます。これでフォーカスリングが作成されますが、nsboxのタイトルをクリックすると作成されます。しかし、nsboxのどこかをクリックすると表示されるようにしたい(私はタイトルを持たない)。 drawFocusRingMaskを呼び出すと、nsbox全体が黒色で塗りつぶされます。タイトルがクリックされただけでなく、ボックス内のどこにでもフォーカスリングを表示する方法はありますか? – Dennis
これは、フォーカスリングの動作方法ではありません。特に10.7以降では、AppKitがフォーカスリングの多くを自動的に処理します。おそらく、フォーカスリングの考え方をやめて、最初の応答者がその子孫のビューの1つであるときはいつも、(カスタムで)異なる方法で描画するカスタムビューを作成する必要があります。 –
私は10.7以前のフォーカスリングの描画手法を使ったアプローチを考え、自分の答えを編集しました。 –
NSBoxがフォーカスを持っているとはどういう意味ですか?それが受け取る重要な出来事とは何でしょうか? NSBoxをサブクラス化し、 '-acceptsFirstResponder'をオーバーライドしてYESを返すことで何かを達成できるかもしれませんが、受け取るキーイベントで何かする必要があります。 –
@KenThomases私はそれがフォーカスを持っていると言ってボックスのフォーカスリングを描くことを意味しました。私はそれが必要なときに境界線の周りにフォーカスリングを描くボックスや何かが必要です。それを行う簡単な方法はありますか? NSBoxのサブクラス化とacceptsFirstResponderのオーバーライドを試みましたが、何の効果もありませんでした。 – Dennis