2011-03-07 95 views
0

我正在使用this Cocoa with Love文章中顯示的方法來創建自定義NSWindow子類。就像在這個例子中,爲了繪製一個箭頭(我正在創建一個彈出式窗口),我需要在窗口內容周圍留出大約10px的邊距。我必須在整個窗口周圍留有餘量,而不是隻有帶有箭頭的一側,因爲我希望能夠更改箭頭位置而不必重新定位內容。自定義NSWindow內容邊緣導致自動調整面具

總之,我使用要做到這一點的方法是(相關代碼在底部):

  • 覆蓋NSWindow的contentRectForFrameRect:frameRectForContentRect:styleMask:方法來添加內容周圍的填充:
  • 將窗口的自定義繪製框架視圖設置爲contentView,然後覆蓋contentView的setter和getter,以便將傳入的視圖添加爲框架視圖的子視圖

的問題是,意見的自動尺寸口罩內窗口的實際內容查看完全搞砸了。下面是我如何設置界面生成器中的內容:

Layout

這裏是如何表視圖滾動視圖的自動尺寸調整掩碼設置:

Table View Autoresizing

而且這裏是如何文本標籤的自動尺寸調整掩碼設置:

Label Autoresizing

而這裏的結果是什麼樣的應用程式:

Actual result

相關代碼(從上述文章中得出)

#define CONTENT_MARGIN 10.0 

- (NSRect)contentRectForFrameRect:(NSRect)windowFrame 
{ 
    windowFrame.origin = NSZeroPoint; 
    return NSInsetRect(windowFrame, CONTENT_MARGIN, ICONTENT_MARGIN); 
} 

- (NSRect)frameRectForContentRect:(NSRect)contentRect 
{ 
    return NSInsetRect(contentRect, -CONTENT_MARGINT, -CONTENT_MARGIN); 
} 

+ (NSRect)frameRectForContentRect:(NSRect)contentRect 
         styleMask:(NSUInteger)windowStyle 
{ 
    return NSInsetRect(contentRect, -CONTENT_MARGIN, -CONTENT_MARGIN); 
} 


- (NSView*)contentView 
{ 
    return _popoverContentView; 
} 

- (void)setContentView:(NSView *)aView 
{ 
    if ([_popoverContentView isEqualTo:aView]) { return; } 
    NSRect bounds = [self frame]; 
    bounds.origin = NSZeroPoint; 
    SearchPopoverWindowFrame *frameView = [super contentView]; 
    if (!frameView) { 
     frameView = [[[SearchPopoverWindowFrame alloc] initWithFrame:bounds] autorelease]; 
     [super setContentView:frameView]; 
    } 
    if (_popoverContentView) { 
     [_popoverContentView removeFromSuperview]; 
    } 
    _popoverContentView = aView; 
    [_popoverContentView setFrame:[self contentRectForFrameRect:bounds]]; 
    [_popoverContentView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 
    [frameView addSubview:_popoverContentView]; 
} 

我想,也許正想過的酥料餅的內容不知何故,所以我畫了一個內容視圖邊框,但不是,一切都應該是。唯一的問題是內容視圖中標籤和表格視圖的自動識別蒙版不能像他們應該那樣工作。任何意見是極大的讚賞。

編輯:如果任何人有興趣,我已經在github上打開了這個彈出窗口/控制器的完整代碼,如INPopoverController。包含一個示例項目,以防您嘗試重現問題。

+0

Xcode 4目前處於NDA下。你可以向我們展示截圖嗎? – 2011-03-07 02:40:47

+0

我已經刪除/替換了顯示Xcode 4的部分,但我確定每個人都知道它現在的樣子。 – indragie 2011-03-07 02:47:57

+0

您的表視圖的滾動視圖應該在自動大小檢查器中連接的底邊上有支撐。 – 2011-03-07 05:53:54

回答

1
-(void)scaleWindowForHeight:(float)height 
{ 
    if (height > 22) 
    { 
     NSWindow* window = [self window]; 
     NSRect old_window_frame = [window frame]; 
     NSRect old_content_rect = [window contentRectForFrameRect: old_window_frame]; 
     NSSize new_content_size = NSMakeSize(old_window_frame.size.width, height); 
     // need to move window by Y-axis because NSWindow origin point is at lower side: 
     NSRect new_content_rect = NSMakeRect(NSMinX(old_content_rect), NSMaxY(old_content_rect) - new_content_size.height, new_content_size.width, new_content_size.height); 
     NSRect new_window_frame = [window frameRectForContentRect: new_content_rect]; 
     [window setFrame: new_window_frame display:YES animate: [window isVisible] ]; 
    } 
    else 
     NSLog(@"window size too small"); 
} 
相關問題