【问题标题】:Changing OSX app window size based on user input that changes views根据更改视图的用户输入更改 OSX 应用程序窗口大小
【发布时间】:2016-03-30 05:18:24
【问题描述】:

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

默认值都非常适合在用户更改窗口大小时修改对象,但不擅长在视图中的对象更改时更改窗口大小。

我已经看到了一些重新计算原点和帧大小的示例 - 我认为其中的数学部分将是直截了当的。但是,我无法获得对 NSWindow 对象的工作引用。单击拖动不会在任何 .swift 文件(AppDelegate、ViewController、自定义)中为窗口存放 IBOutlet。并且输入它不会绑定它。

我正在尝试完成的简化示例: 根据用户输入,更改显示内容,并调整窗口大小以包含新修改的显示。 在我的主故事板上 - 窗口控制器,继续 - 视图控制器,包含一个水平滑块和一个容器视图。容器视图被设置为 - 水平拆分视图控制器,segued to - 视图控制器的三个重复实例。

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

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

想象一下文本“小组”在哪里,有下拉框、文本框、单选按钮等的集合。

【问题讨论】:

  • 我应该提到/标记我正在使用 xcode 7.2。我找到了其他几个依赖 IBOutlet 来获取对窗口的引用的解决方案——但我还没有找到让它工作的方法。想知道它的功能是否被关闭?我导入了一个最初在 6.x 中构建的示例应用程序 - 这正是阻止它构建的原因。
  • 我不明白您如何无法获得对您的窗口的引用。如果您创建一个新项目,则应用程序委托已经有一个窗口的出口。将您的项目与新项目进行比较,看看您做错了什么。
  • @rocky - 在过去的几周里,我可能已经生成了几十个新项目 - 没有一个在 AppDelegate 中有 IBOutlet。我刚刚将 xcode 升级到 7.3 - 没有好消息。
  • 我发现了这个...reddit post 我尝试将 myWindow 声明为 NSWindow 并将其指向 NSApp.mainWindow - 在运行时它失败了,声称内容为零。
  • 我明白了。基本上,故事板是从 iOS 开始的,直到最近才被“移植”到 OSX。传统上,您可以使用 xib 和(可选)窗口控制器来创建应用程序。基本模板(无情节提要,非基于文档的应用程序)为您提供了一个应用程序,该应用程序具有由应用程序委托(作为插座)拥有的单个窗口,并在与应用程序主菜单相同的 xib 中定义。如果您的逻辑变得足够复杂,您可以添加更多 xib 和 NSWindowController 子类来拥有这些窗口。如果您在创建项目时取消选中“使用故事板”,这在今天仍然有效。

标签: xcode swift macos nswindow


【解决方案1】:

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

下面是我的 Main.storyboard 的截图。所有编码都在与第一个视图控制器关联的 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)
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2017-07-14
    相关资源
    最近更新 更多