#ios #swift #uinavigationbar #uinavigationitem #preferslargetitles
Вопрос:
Кажется, что я не могу установить navigationItem.largeTitleDisplayMode = .always
, если я тоже не установлю navigationBar.prefersLargeTitles = true
? Является ли это намеренным поведением?
Мне очень трудно поверить, что Apple заставит меня вручную настраивать largeTitleDisplayMode = .never
каждый экран в навигационном контроллере, даже те, которыми я не управляю, чтобы показать только один экран с большими заголовками.
Комментарии:
1. Является ли это намеренным поведением? ответ: да, это предназначено: developer.apple.com/documentation/uikit/uinavigationitem/…
Ответ №1:
Вы можете попробовать управлять этим с помощью вызовов UINavigationControllerDelegate.willShow, подобных этому.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.delegate = self
}
}
// Assumption: ViewController is rootViewController for the UINavigationController
extension ViewController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let isRootVC = (viewController === self)
viewController.navigationItem.largeTitleDisplayMode = isRootVC ? .always : .never
}
}
Обновить
Другим вариантом было бы выполнить то же самое управление при viewWillAppear(_:)
viewWillDisappear(_:)
вызовах amp; для экземпляра RootViewController в вашем стеке навигации.
Комментарии:
1. Я бы предпочел не идти таким изнурительным путем, как этот. Есть случаи, когда мне может понадобиться делегат NavigationController, и я не могу допустить, чтобы он был переопределен каждым контроллером представления
2. Это должно быть сделано
rootViewController
только для — Не для каждого подкласса UIViewController в этом стеке навигации.3. Он по-прежнему переопределяет делегат NavigationController, что довольно банально, и я не хочу этого делать, так как это приведет к другим проблемам. Я просто хочу иметь возможность установить
largeTitleDisplayMode
для отдельного контроллера вида и заставить навигационный контроллер уважать это значение4. Другим вариантом было бы выполнить то же самое управление при
viewWillAppear(_:)
viewWillDisappear(_:)
вызовах amp; для экземпляра RootViewController в вашем стеке навигации. Здесь нет красивого решения.