【问题标题】:Set NSWindow Size programmatically以编程方式设置 NSWindow 大小
【发布时间】:2012-09-08 10:15:50
【问题描述】:

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

【问题讨论】:

    标签: objective-c macos window size nswindow


    【解决方案1】:

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

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

    【讨论】:

    • 你是如何获得myKnownContentSize的?
    • myKnownContentSize 是我想要的窗口内容的任何大小。这段代码 sn-p 然后使窗口本身具有适应标题栏(或其他未来操作系统添加)的相应大小。
    【解决方案2】:

    swift 4.x 7 OSX 我的两分钱:

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

    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)
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      斯威夫特版本

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

      【讨论】:

        【解决方案4】:

        使用setFrame:display:animate:

        [window setFrame:NSMakeRect(0.f, 0.f, 200.f, 200.f) display:YES animate:YES];
        

        【讨论】:

        • 不知道 NSMakeFrame 是什么。我使用 NSMakeRect。
        【解决方案5】:

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

        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;
        

        【讨论】:

        • 或者更好的是:frame.origin.y += (frame.size.height - theSizeYouWant.height);
        【解决方案6】:

        使用-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
        

        【讨论】:

        • @Leo 的回答有道理,或者至少我看到了同样的事情 - +/- 应该颠倒。
        • 我已经尝试过这段代码,但我的窗口仍然向下移动。任何停止移动窗口的解决方案。
        • 非常适合我。我想以编程方式调整作为工作表视图呈现的窗口控制器的大小。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 2015-01-09
        相关资源
        最近更新 更多