2015-08-07 6 views
1

Я новичок в Swift и Xcode: Я пытаюсь написать приложение для какао и не могу понять, как полностью скрыть содержимое моего NSWindow. Я использую Swift на Xcode версии 6.3.2; Пользовательский интерфейс, разработанный с использованием раскадровки.Как показать только панель инструментов на NSWindow

Фон: Я разрабатываю приложение, где некоторые элементы управления отображаются пользователю на панели инструментов окна. Одним из этих элементов управления является кнопка раскрытия, используемая для переключения содержимого: нажатие кнопки позволяет пользователю расширить содержимое окна под панелью инструментов, чтобы просмотреть некоторые виды с дополнительными деталями. Нажатие кнопки раскрытия информации снова сворачивает содержимое окна, скрывая просмотры, содержащиеся в окне, и снова отображает только панель инструментов. Когда приложение загружается, должна отображаться только панель инструментов - все содержимое окна должно быть скрыто, поскольку в данный момент они неактуальны.

В моей WindowController.swift, у меня есть:

class WindowController: NSWindowController, NSToolbarDelegate { 

override func windowDidLoad() { 
    super.windowDidLoad() 

    window?.hideContents() 
} 

И я определил расширение NSWindow; в NSWindow.swift у меня есть:

private let TOOLBAR_WIDTH:CGFloat = 350.0 
private let TOOLBAR_HEIGHT:CGFloat = 75.0 
private let CONTENT_WIDTH:CGFloat = 800.0 
private let CONTENT_HEIGHT:CGFloat = 600.0 

public extension NSWindow { 

    private var screenHeight : CGFloat { 
     get { 
      return NSScreen.mainScreen()!.frame.height 
     } 
    } 

    public func hideContents() { 
     let view = contentView as! NSView 
     view.hidden = true 
     view.needsDisplay = true 

     collapseContentsFrame() 
    } 

    private func collapseContentsFrame() { 

     var newFrame = NSRect(x:frame.origin.x, y:screenHeight, width: TOOLBAR_WIDTH, height: TOOLBAR_HEIGHT) 

     setFrame(newFrame, display: false, animate: false) 
    } 

    public func showContents() { 
     let view = contentView as! NSView 
     view.hidden = false 
     view.needsDisplay = true 

     expandContentsFrame() 
    } 

    private func expandContentsFrame() { 

     var newFrame = NSRect(x: frame.origin.x, y: screenHeight, width: CONTENT_WIDTH, height: CONTENT_HEIGHT) 

     setFrame(newFrame, display: true, animate: false) 
    } 
} 

Этот вид работ: он скрывает содержимое взглядов, содержащихся в окне, и сжимает кадр почти до того же размера, что и панель инструментов. Тем не менее, под панелью инструментов показывается широкий пустой прямоугольник - похоже, что рамка окна не изменяет размер (не может размещать изображение, поскольку у меня нет разрешения). Я попытался настроить значения в новом фрейме, но я не могу исключить лишнее пространство, отображаемое под панелью инструментов.

В раскадровке содержимое окна связано с TabViewController - не уверен, что это имеет к этому какое-то отношение. Любые предложения/идеи будут с благодарностью оценены.

+0

Итак, вы просто хотите окно размером с NSToolbar? Можете ли вы объяснить, почему вы этого хотите, поскольку панель инструментов предназначена для изменения содержимого в представлении контента. –

+0

Лукас, спасибо за ваш ответ. Согласно вашему предложению, я отредактировал вопрос, чтобы предоставить более подробную информацию. – buzo

+0

Используете ли вы автоматический макет в отображаемом контроллере? Смысл, есть ли что-то, что заблокировало бы контент от рушится? –

ответ

0

Благодаря Макс и Лукасу за их предложения. Я попытался удалить представление содержимого, сохранив ссылку на него в моем WindowController, а затем добавив его обратно в окно всякий раз, когда окно будет расширено. Хотя это решило проблему под рукой, она создала для меня новые проблемы: я программно вызываю segue с панели инструментов, но если окно не имеет представления контента, этот вызов segue падает.

Решение, которое в конечном итоге работает для меня, требует временного удаления ограничений в представлении содержимого, когда содержимое окна скрыто, а затем добавление ограничений назад, когда вид содержимого становится видимым. Для справки (в случае, если кто-то еще работает в это в будущем), вот что я сделал:

В моей WindowController.swift:

class WindowController: NSWindowController, NSToolbarDelegate { 

    var mainWindow:Window { 
     get { 
      return window! as! Window 
     } 
    } 

    override func windowDidLoad() { 

     super.windowDidLoad() 

     mainWindow.hideContents() 
    } 
} 

В настраиваемой NSWindow подкласса:

import Cocoa 

class Window : NSWindow { 

    private let TOOLBAR_WIDTH:CGFloat = 350.0 
    private let TOOLBAR_HEIGHT:CGFloat = 75.0 
    private let CONTENT_WIDTH:CGFloat = 800.0 
    private let CONTENT_HEIGHT:CGFloat = 600.0 

    private var constraints:[NSLayoutConstraint] = [NSLayoutConstraint]() 

    override init(contentRect: NSRect, 
     styleMask windowStyle: Int, 
     backing bufferingType: NSBackingStoreType, 
     defer deferCreation: Bool) { 

     super.init(contentRect: contentRect, styleMask: windowStyle, backing: bufferingType, defer: deferCreation) 
    } 

    required init?(coder: NSCoder) { 
     super.init(coder: coder) 
    } 

    private var screenHeight : CGFloat { 
     get { 
      return NSScreen.mainScreen()!.frame.height 
     } 
    } 

    private var view : NSView { 
     get { 
      return contentView as! NSView 
     } 
    } 

    func hideContents() { 

     view.hidden = true 

     collapseContentsFrame() 

     removeConstraints() 
    } 

    private func collapseContentsFrame() { 
     var newFrame = NSRect(x:frame.origin.x, y:screenHeight, width: TOOLBAR_WIDTH, height: TOOLBAR_HEIGHT) 
     setFrame(newFrame, display: false, animate: false) 
    } 

    private func removeConstraints() { 
     constraints = view.constraints as! [NSLayoutConstraint] 
     for constraint in constraints { 
      view.removeConstraint(constraint) 
     } 
    } 

    func showContents() { 

     view.hidden = false 

     expandContentsFrame() 

     addConstraints() 
    } 

    private func expandContentsFrame() { 
     var newFrame = NSRect(x: frame.origin.x, y: screenHeight, width: CONTENT_WIDTH, height: CONTENT_HEIGHT) 
     setFrame(newFrame, display: true, animate: false) 
    } 

    private func addConstraints() { 
     for constraint in constraints { 
      view.addConstraint(constraint) 
     } 
    } 
} 

Затем в моей Main.storyboard я выбираю узел Window в контуре документа и вывожу инспектора идентификации (CMD + ALT + 3). Затем я определил свой класс «Window» в поле «Custom Class».