我有一个带有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中移动。随着时间的推移,它们实际上越来越远,直到最终只有一个空白视图。
答案 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
您可以从中提取所需内容。