NSWindow запускается с неправильным размером после установки contentViewController в NSTabViewController
У меня есть проект Xcode с NSWindowController
чья contentViewController
был установлен на подкласс NSViewController
, Я недавно удалил NSViewController
подкласс от раскадровки и заменил contentViewController
с NSTabViewController
подкласс.
Теперь, когда я запускаю приложение, NSWindow
открывается с размером 500x500 вместо размера первой вкладки. Более того, в раскадровке нет представления, которое имеет размер 500x500, и этот размер также не является программным. Само окно имеет другой размер, как и вид в NSTabViewController
первый NSViewController
,
Я предполагаю, что есть какое-то ограничение, которое я должен установить где-то, но если оно есть, я не знаю, где и как его найти. Использование Xcode 9.2 и High Sierra.
Программно установить размер окна на правильный размер в windowDidLoad()
работает, но если я когда-нибудь изменю размер представления, мне тоже придется это изменить, что быстро устареет.
Извините, если это расплывчато; Я действительно понятия не имею, какой скриншот или фрагмент кода будет полезен.
2 ответа
Я недавно столкнулся с этой неприятной проблемой.
Есть несколько вариантов решения этой проблемы:
Как вы упомянули, установите
preferredContentSize
в каждом из ваших пользовательских контроллеров представления, которые удерживают содержимое вкладки до желаемого размера. Это негибко, но это работает.// Swift class FooViewController: ViewController { override func viewWillAppear() { super.viewWillAppear() preferredContentSize = NSSize(width: 400, height: 280) } }
Я нашел намек на лучшее решение в этом 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
получает изначально установлен.
Установка предпочтительного размера контента в каждом контроллере представления с вкладками не идеальна: один и тот же код дублируется на нескольких контроллерах и добавляет ненужный шум, если эти контроллеры используются повторно где-либо еще.
У меня была похожая проблема. Я добавил контроллер представления с представлением контейнера в качестве содержимого окна и направил содержимое представления контейнера на контроллер представления вкладок.