2016-03-30 6 views
1

Я пытаюсь изо всех сил разрабатывать приложение OSX. Xcode и Swift для меня все новы.Изменение размера окна приложения OSX на основе пользовательского ввода, который меняет вид

Значения по умолчанию очень хороши при изменении объектов, когда пользователь меняет размер окна, но не настолько хорош при изменении размера окна при изменении объектов в представлении.

Я видел несколько примеров пересчета происхождения и размера рамки - я думаю, что математическая часть этого будет прямолинейной. Однако я не могу получить рабочую ссылку на объект NSWindow. перетаскивание клика не откладывает IBOutlet для окна в любом из файлов .swift (AppDelegate, ViewController, custom). И набрав его, он не связывает его.

Упрощенный пример того, что я пытаюсь выполнить: Основываясь на пользовательском вводе, измените содержимое дисплея и отрегулируйте размер окна, чтобы охватить недавно измененный дисплей. На моей главной раскадровке - Контроллер окна, отведенный до - Просмотр контроллера, содержащий горизонтальный слайдер и вид контейнера. Вид контейнера отложен до - Горизонтальный контроллер с разделенным изображением, отнесенный к - три повторяющихся экземпляра контроллера просмотра.

Когда пользователь меняет ползунок, один или несколько из трех нижних контроллеров большинства представлений будут скрыты/невидимы.

Прилагаемые фотографии показывают поведение, которое я ищу.

Представьте себе, где текст "небольшая группа", есть коллекция выпадающего коробки, текстовые поля, радио-кнопки и т.д.

Slider bar at three, see three groups

Slider bar at two, see two groups

Slider bar at one, see one group

+0

Я должен был упомянуть/отмечен Я использую xcode 7.2. Я нашел несколько других решений, которые полагаются на IBOutlet для получения ссылки на окно, но я просто не нашел способ заставить его работать. Хотите узнать, закрыта ли функция? Я импортировал пример приложения, первоначально построенного в 6.x - это не помешало ему построить. – OldUgly

+0

Я не вижу, как вы не можете получить ссылку на свое окно. Если вы создаете новый проект, делегат приложения уже имеет выход к окну. Сравните ваш проект с новым проектом, чтобы увидеть, что вы делаете неправильно. – rocky

+0

@rocky - За последние пару недель я, вероятно, создал несколько десятков новых проектов - ни у кого не было IBOutlet в AppDelegate. Я просто обновил xcode до 7.3 - никаких хороших новостей. – OldUgly

ответ

0

Я отвечаю на свой собственный вопрос здесь - все еще не могу связать IBOutlet с NSWindow. Любой, у кого есть лучшие решения, сообщите мне.

Ниже приведена запись моего Main.storyboard. Все кодирование выполняется в классе junkViewController2, который связан с 1-м контроллером представления.

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

}