Подтвердить что ты не робот

Навигационная панель с большим заголовком iOS 11 не рушится

Яблочный парень в Что нового в Cocoa Touch WWDC video сказал, что новая панель навигации большого заголовка волшебным образом подключится к вид прокрутки верхнего уровня основного контроллера представления и сворачивание/разворот автоматически при прокрутке вверх и вниз. (И "магически" он, вероятно, имел в виду, что они не смогли обезвредить эту функциональность в уже смущающие API UINavigationController - UINavigationBar - UINavigationitem удобным образом, поэтому им приходилось прибегать к подключению к некоторым эвристически выбранным просмотр прокрутки за кулисами)

Несмотря на то, что я был готов, чтобы этот "автоматический" сбой/расширение не работал, если я отклоняюсь от базовой установки UINavigationController + UITableView/UICollectionView, кажется, что даже в этом простейшем случае это не работает должным образом.

Вот что у меня есть:

A UITabBarController, который содержит a UINavigationController, который содержит a UIViewController, который имеет UITableView как его view. Нажатие первой ячейки в таблице будет нажимать второй контроллер представления в стеке навигации:

раскадровка

Нет кода, просто раскадровки.

Я проверил "Предпочитает большие заголовки" для панели навигации, чтобы активировать большие заголовки. Теперь, если я запустил приложение и прокручу вверх/вниз по представлению таблицы, панель навигации останется такой же - большой размер; он не разрушается:

застрял с большим заголовком

Однако я обнаружил, что если я установил второй элемент навигации контроллера просмотра, чтобы использовать небольшую навигационную панель (установив "Large Title" на значение "Never" ), тогда, если я открою эту страницу и вернусь назад, интерактивный коллапс волшебным образом начинает работать на первой странице:

интерактивный сбой работает после обратной навигации

Мне что-то не хватает, или эта функция работает неправильно? Вот пример проекта, который я использую: https://github.com/tzahola/iOS-11-Large-Title-Navigation-Bar

И, кстати, я использую официально выпущенный iOS 11, а не бет.

2017-09-23 Обновление: я отправил отчет об ошибке в Apple и открыл билет на openradar.me: http://www.openradar.me/radar?id=5017601935671296

4b9b3361

Ответ 1

Хорошие новости! Я только что понял, что если бы я установил "Большие заголовки" на "Никогда" на раскадровке, а затем установил его с помощью кода, то он работает:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;
}

Похоже, что Apple забыла обработать случай, когда элемент навигации имеет свой largeTitleDisplayMode, установленный через Interface Builder.

Итак, пока они не исправят эту проблему, оставьте "Большие заголовки" как "Никогда" на раскадровки и установите их по коду в viewDidLoad.

Вам просто нужно сделать это с первым контроллером представления. Последующие контроллеры видят ценность в раскадровке.

Ответ 2

Или вместо того, чтобы что-либо менять в раскадровке, сделайте следующее:

override func viewDidLoad() {
    super.viewDidLoad()
    if #available(iOS 11.0, *) {
        self.navigationItem.largeTitleDisplayMode = .never
        self.navigationItem.largeTitleDisplayMode = .always
    }
}

Независимо от того, на каком языке!

Это связано с тем, что большие заголовки в элементе навигации решают, следует ли сворачиваться на основе поведения большого заголовка в заголовке предыдущего экрана.

Ответ 3

@TamasZahola @mohamede1945

Ребята, у меня была такая же проблема. Я смог решить эту проблему, добавив следующий сниппет на мой первый контроллер просмотра контроллера навигации

navigationController?.navigationBar.prefersLargeTitles = true

Ответ 4

Поскольку я не могу комментировать, я поделюсь с вами ответом, который я разместил

fooobar.com/info/203607/...

Я нашел обходное решение на этом сайте в основном, если tableView (или элемент с прокруткой) не является первым представлением в вашей иерархии представлений, большой заголовок автоматически не скроется.

Пример, который НЕ будет работать Пример, который будет работать

https://markusbodner.com/2017/10/08/fix-large-navigation-bar-title-not-hiding-on-scroll-in-ios-11/

Я добавил на представление willAppear:

        if #available(iOS 11.0, *) {
        navigationController?.navigationBar.prefersLargeTitles = true
    } else {
        // Fallback on earlier versions
    }