调整NSWindow的大小以适应新的NSView会导致视图被错误地绘制

doo*_*ork 12 cocoa objective-c

我有一个带有setCurrentView方法的NSWindowController,我在其中使用以下代码将窗口大小调整为新视图的大小.

[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];
Run Code Online (Sandbox Code Playgroud)

编辑:添加了我在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]];
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当你在视图之间切换(使用NSToolbar)时,视图开始在contentView中移动.随着时间的推移,他们实际上越来越远,直到最终只有一个空白视图.

小智 18

而不是使用类方法:

+[NSWindow frameRectForContentRect:styleMask:]
+[NSWindow contentRectForFrameRect:styleMask:]
Run Code Online (Sandbox Code Playgroud)

使用实例方法:

-[NSWindow frameRectForContentRect:]
-[NSWindow contentRectForFrameRect:]
Run Code Online (Sandbox Code Playgroud)

代替.实例方法将工具栏考虑在内,并且只要您有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]];
}
Run Code Online (Sandbox Code Playgroud)