根据更改视图的用户输入更改 OSX 应用 window 大小

Changing OSX app window size based on user input that changes views

我正在尝试开发 OSX 应用程序。 Xcode 和 Swift 对我来说都是新的。

默认值都非常擅长在用户改变 window 大小时修改对象,但不太擅长在视图中的对象改变时改变 window 大小。

我看过几个重新计算原点和帧大小的示例 - 我认为其中的数学部分很简单。但是,我无法获得对 NSWindow 对象的工作引用。单击拖动不会在任何 .swift 文件(AppDelegate、ViewController、自定义)中存放 window 的 IBOutlet。并且输入它不会绑定它。

我正在努力完成的一个简化示例: 根据用户输入,更改显示内容,并调整 window 大小以包含新修改的显示。 在我的主故事板上 - Window 控制器,转至 - 视图控制器,包含一个水平滑块和一个容器视图。容器视图被转到 - 水平拆分视图控制器,转至 - 视图控制器的三个重复实例。

当用户更改滑块时,最底部的三个视图控制器中的一个或多个将 hidden/unhidden。

所附图片显示了我正在寻找的行为。

试想文本"small group"所在的位置,有下拉框、文本框、单选按钮等的集合

我在这里回答我自己的问题 - 仍然无法将 IBOutlet 与 NSWindow 绑定。谁有更好的解决方案,请告诉我。

下面是我的 Main.storyboard 的截图。所有编码都在与第一个视图控制器关联的 class junkViewController2 中完成。

这里是junkViewController2的代码。我知道,它可以更简洁......

//
//  JunkViewController2.swift
//  Scratch1
//

import Cocoa

class JunkViewController2: NSViewController {

    var junkSplitViewController: JunkSplitViewController!
    var myWindow: NSWindow!
    var dy: CGFloat!

    @IBOutlet weak var mySlider: NSSlider!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.
        dy = 0.0
    }

    @IBAction func mySlider(sender: NSSlider) {

        let junkSplitViewController = self.childViewControllers[0]
        dy = 0.0
        for controller in junkSplitViewController.childViewControllers {
            if controller.title == "smallGroup1" {
                if mySlider.intValue > 0 {
                    if controller.view.hidden {
                        dy = dy + 30.0
                    }
                    controller.view.hidden = false
                } else {
                    if !controller.view.hidden {
                        dy = dy - 30.0
                    }
                    controller.view.hidden = true
                }
            }
            if controller.title == "smallGroup2" {
                if mySlider.intValue > 1 {
                    if controller.view.hidden {
                        dy = dy + 30.0
                    }
                    controller.view.hidden = false
                } else {
                    if !controller.view.hidden {
                        dy = dy - 30.0
                    }
                    controller.view.hidden = true
                }
            }
            if controller.title == "smallGroup3" {
                if mySlider.intValue > 2 {
                    if controller.view.hidden {
                        dy = dy + 30.0
                    }
                    controller.view.hidden = false
                } else {
                    if !controller.view.hidden {
                        dy = dy - 30.0
                    }
                    controller.view.hidden = true
                }
            }
        }
        resize()
    }

    func resize() {
        var windowFrame = NSApp.mainWindow!.frame
        let oldWidth = windowFrame.size.width
        let oldHeight = windowFrame.size.height
        let old_x = windowFrame.origin.x
        let old_y = windowFrame.origin.y
        let toAdd = CGFloat(dy)
        let newHeight = oldHeight + toAdd
        let new_y = old_y - toAdd
        windowFrame.size = NSMakeSize(oldWidth, newHeight)
        windowFrame.origin = NSMakePoint(old_x, new_y)
        NSApp.mainWindow!.setFrame(windowFrame, display: true)
    }

}