以编程方式设置NSWindow大小

25

我如何以编程方式设置窗口大小?我在IB中有一个窗口,我想在我的代码中设置它的大小,使其更大。

6个回答

35

使用-setFrame:display:animate:可以获得最大的控制权:

NSRect frame = [window frame];
frame.size = theSizeYouWant;
[window setFrame: frame display: YES animate: whetherYouWantAnimation];

请注意,窗口坐标与您所熟悉的不同。在OS X的Quartz/Cocoa中,矩形的原点位于其左下角。为确保原点保持不变,请做如下处理:

NSRect frame = [window frame];
frame.origin.y -= frame.size.height; // remove the old height
frame.origin.y += theSizeYouWant.height; // add the new height
frame.size = theSizeYouWant;
// continue as before

1
@Leo的回答有一定道理,或者至少我看到了同样的事情 - +/-应该被颠倒。 - Nikolay Tsenkov
1
我已经尝试了这段代码,但是我的窗口仍然向下移动。有什么解决方法可以停止窗口移动吗? - princ___y
对我来说完美地运作了。我想以编程方式调整一个作为表视图呈现的窗口控制器的大小。谢谢! - Supertecnoboff
请注意,在viewDidAppear()中立即更改大小是行不通的,需要使用计时器或其他方法... - Mushrankhan

12

实际上似乎需要反转+/-以防止窗口在屏幕上移动:

NSRect frame = [window frame];
frame.origin.y += frame.size.height; // origin.y is top Y coordinate now
frame.origin.y -= theSizeYouWant.height; // new Y coordinate for the origin
frame.size = theSizeYouWant;

2
或者更好的方法是:frame.origin.y += (frame.size.height - 您想要的高度); - mojuba

8

Swift版本

var frame = self.view.window?.frame
frame?.size = NSSize(width: 400, height:200)
self.view.window?.setFrame(frame!, display: true)

4

3
不知道 NSMakeFrame 是什么。我使用 NSMakeRect。 - Marc Rochkind

4

通常我希望根据内容的大小(不包括标题栏)来调整窗口的大小:

var rect = window.contentRect(forFrameRect: window.frame)
rect.size = myKnownContentSize
let frame = window.frameRect(forContentRect: rect)
window.setFrame(frame, display: true, animate: true)

你是如何推导出 myKnownContentSize 的? - rustyMagnet
myKnownContentSize 只是我想要的窗口内容的大小。然后,这段代码使窗口本身具有相应的大小,以适应标题栏(或其他未来的操作系统添加)。 - Robin Stewart

0

关于Swift 4.x和OSX的建议:

a) 不要在viewDidLoad中调用 b) 进入主队列... c) 等待一段时间...例如使用:

private final func setSize(){
    if let w = self.view.window{
        var frame = w.frame
        frame.size = NSSize(width: 400, height: 800)
        w.setFrame(frame, display: true, animate: true)

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接