2011-06-08 69 views
12

我有一個NSWindowController與setCurrentView方法,其中我使用下面的代碼來調整窗口的大小以適應新視圖的大小。調整NSWindow以適應新的NSView導致視圖被錯誤地繪製

[self resizeWindowForContentSize: [newView frame].size]; 

NSView *contentView = [[self window] contentView]; 
NSDictionary *ani = [NSDictionary dictionaryWithObject:transition 
               forKey:@"subviews"]; 
[contentView setAnimations:ani];  
[[contentView animator] replaceSubview:currentView with:newView]; 

編輯:增加了我對CocoaDev發現resizeWindowForContentSize。

- (void)resizeWindowForContentSize:(NSSize) size { 
    NSRect windowFrame = [NSWindow contentRectForFrameRect:[[self window] frame] 
     styleMask:[[self window] styleMask]]; 
    NSRect newWindowFrame = [NSWindow frameRectForContentRect: 
     NSMakeRect(NSMinX(windowFrame), NSMaxY(windowFrame) - size.height, size.width, size.height) 
    styleMask:[[self window] styleMask]]; 
    [[self window] setFrame:newWindowFrame display:YES animate:[[self window] isVisible]]; 
} 

我遇到的問題是,當你的看法(使用NSToolbar)之間切換的觀點開始在內容查看走動。隨着時間的推移,他們實際上越來越遠,直到最終只有一片空白的景色。

+0

您可以發佈您'-resizeWindowForContentSize:'方法? – NSGod 2011-06-08 20:30:44

+0

我已經使用該方法更新了帖子。 – doomspork 2011-06-08 20:44:29

回答

18

而不是使用類方法:

+[NSWindow frameRectForContentRect:styleMask:] 
+[NSWindow contentRectForFrameRect:styleMask:] 

使用實例方法:

-[NSWindow frameRectForContentRect:] 
-[NSWindow contentRectForFrameRect:] 

代替。實例方法將工具欄考慮在內,只要您有NSWindow實例,就應該使用實例方法 - 您可以通過[self window]執行此操作。

例如,假設這是你的-resizeWindowForContentSize:方法問題:

- (void)resizeWindowForContentSize:(NSSize) size { 
    NSWindow *window = [self window]; 

    NSRect windowFrame = [window contentRectForFrameRect:[window frame]]; 
    NSRect newWindowFrame = [window frameRectForContentRect: 
     NSMakeRect(NSMinX(windowFrame), NSMaxY(windowFrame) - size.height, size.width, size.height)]; 
    [window setFrame:newWindowFrame display:YES animate:[window isVisible]]; 
} 
+0

這適用於第一個視圖開關,但在初始視圖之後每個轉換都會發生同樣的問題。 – doomspork 2011-06-09 03:52:21

+0

@Doom你的代碼沒有顯示你設置'newView'的框架 - 特別是框架原點。調整窗口大小後,設置視圖的框架原點('-setFrameOrigin:'),以便其y座標是視圖框架的高度。 – 2011-06-09 04:37:47

+0

我遵循你的建議,最初它不起作用。但是,當我將newView的原點設置爲0,0時,它每次都能很好地工作! – doomspork 2011-06-09 15:12:01

3

我的猜測是,您可能忘記考慮工具欄高度和/或窗口標題欄的22像素高度。

我一直在使用上NSWindow這一類的時間比我還記得:

@implementation NSWindow (MDAdditions) 

- (CGFloat)toolbarHeight { 
    NSToolbar *toolbar = [self toolbar]; 
    CGFloat toolbarHeight = 0.0; 
    NSRect windowFrame; 

    if (toolbar && [toolbar isVisible]) { 
     windowFrame = [[self class] contentRectForFrameRect:[self frame] 
                styleMask:[self styleMask]]; 
     toolbarHeight = NSHeight(windowFrame) - 
         NSHeight([[self contentView] frame]); 
    } 
    return toolbarHeight; 
} 

- (void)resizeToSize:(NSSize)newSize { 
    CGFloat newHeight = newSize.height + [self toolbarHeight]; 
    CGFloat newWidth = newSize.width; 

    NSRect aFrame = [[self class] contentRectForFrameRect:[self frame] 
               styleMask:[self styleMask]]; 

    aFrame.origin.y += aFrame.size.height; 
    aFrame.origin.y -= newHeight; 
    aFrame.size.height = newHeight; 
    aFrame.size.width = newWidth; 

    aFrame = [[self class] frameRectForContentRect:aFrame 
             styleMask:[self styleMask]]; 
    [self setFrame:aFrame display:YES animate:YES]; 
} 

@end 

你也許能夠把解壓出來的有你所需要的。