NSWindow запускается с неправильным размером после установки contentViewController в NSTabViewController

У меня есть проект Xcode с NSWindowController чья contentViewController был установлен на подкласс NSViewController, Я недавно удалил NSViewController подкласс от раскадровки и заменил contentViewController с NSTabViewController подкласс.

Теперь, когда я запускаю приложение, NSWindow открывается с размером 500x500 вместо размера первой вкладки. Более того, в раскадровке нет представления, которое имеет размер 500x500, и этот размер также не является программным. Само окно имеет другой размер, как и вид в NSTabViewController первый NSViewController,

Я предполагаю, что есть какое-то ограничение, которое я должен установить где-то, но если оно есть, я не знаю, где и как его найти. Использование Xcode 9.2 и High Sierra.

Программно установить размер окна на правильный размер в windowDidLoad() работает, но если я когда-нибудь изменю размер представления, мне тоже придется это изменить, что быстро устареет.

Извините, если это расплывчато; Я действительно понятия не имею, какой скриншот или фрагмент кода будет полезен.

2 ответа

Я недавно столкнулся с этой неприятной проблемой.

Есть несколько вариантов решения этой проблемы:

  1. Как вы упомянули, установите preferredContentSize в каждом из ваших пользовательских контроллеров представления, которые удерживают содержимое вкладки до желаемого размера. Это негибко, но это работает.

    // Swift
    class FooViewController: ViewController {
    
        override func viewWillAppear() {
            super.viewWillAppear()
    
            preferredContentSize = NSSize(width: 400, height: 280)
        }
    }
    
  2. Я нашел намек на лучшее решение в этом SO ответе. Вы можете добавить подпредставление (stackview, nsview и т. Д.) К основному представлению контроллера представления, которое обрабатывает содержимое вкладки (фу!), А затем добавить ограничения, которые прикрепляют его к каждому ребру, и добавить ограничения, которые устанавливают размер.

Вот скриншот того, как это выглядит в Интерфейсном Разработчике. Я добавил Stack View, а затем добавил 6 ограничений.

Надеюсь это поможет.

Ответ Иисуса Навина с установкой preferredContentSize сделал свое дело, все слава ему! Стоит отметить, что, поскольку это сделано исключительно для родительского контроллера представления вкладок, было бы неплохо создать его подкласс и перенести эту обработку в tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) Метод делегата, который вызывается при выборе вкладки:

override func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
    tabViewItem?.viewController?.preferredContentSize = tabViewItem?.view?.frame.size
    // Alternatively: tabViewItem?.viewController?.preferredContentSize = tabViewItem?.view?.fittingSize
    super.tabView(tabView, didSelect: tabViewItem)
}

Таким образом, предпочтительный размер контента всегда актуален, и вы можете не беспокоиться о том, чтобы вручную обновлять его, предполагая, что представление обеспечивает правильный размер кадра или размер подгонки, что легко достигается с помощью ограничений.

Этот метод также вызывается после того, как оконный контроллер завершает загрузку и где 500×500 получает изначально установлен.

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

У меня была похожая проблема. Я добавил контроллер представления с представлением контейнера в качестве содержимого окна и направил содержимое представления контейнера на контроллер представления вкладок.

Другие вопросы по тегам