2012-04-07 98 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