根据更改视图的用户输入更改OSX应用程序窗口大小

时间:2016-03-30 05:18:24

标签: xcode swift macos nswindow

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

当用户更改窗口大小时,默认值都非常擅长修改对象,但是当视图中的对象发生更改时,更改窗口大小则不太好。

我已经看过几个重新计算原点和帧大小的例子 - 我认为它的数学部分是直截了当的。但是,我无法获得NSWindow对象的工作参考。 click-drag不会在任何.swift文件(AppDelegate,ViewController,custom)中为窗口存放IBOutlet。输入它并不会绑定它。

我想要完成的一个简化示例: 根据用户输入,更改显示内容,并调整窗口大小以包含新修改的显示。 在我的主要故事板上 - 窗口控制器,被激活 - 视图控制器,包含水平滑块和容器视图。容器视图被伪装成 - 水平拆分视图控制器,被绑定到 - 视图控制器的三个重复实例。

当用户更改滑块时,三个最底层视图控制器中的一个或多个将被隐藏/取消隐藏。

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

想象一下文字"小组"是的,有一系列下拉框,文本框,单选按钮等。

Slider bar at three, see three groups

Slider bar at two, see two groups

Slider bar at one, see one group

1 个答案:

答案 0 :(得分:0)

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

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

enter image description here

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

}