контроллер представления не уважает «режим отображения большого размера»

#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 в вашем стеке навигации. Здесь нет красивого решения.