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

时间:2011-06-08 19:18:29

标签: objective-c cocoa

我有一个带有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];

编辑:添加了我在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)时,视图开始在contentView中移动。随着时间的推移,它们实际上越来越远,直到最终只有一个空白视图。

2 个答案:

答案 0 :(得分: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]];
}

答案 1 :(得分: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

您可以从中提取所需内容。