根据更改视图的用户输入更改 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)
}
}
我正在尝试开发 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)
}
}