iOS 11 prefersLargeTitles не обновляются до прокрутки

Я реализовал базовый UIViewController с UITableView, который обернут в UINavigationController. Я установил prefersLargeTitles в true:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    navigationController?.navigationBar.prefersLargeTitles = true
    navigationItem.title = "Coffees"
}

Однако заголовок остается маленьким, пока я не прокручу представление, тогда он увеличивается. Я попробовал переместить этот вызов туда, где я создаю UINavigationController, но эффекта не было. Я уверен, что navigationController не является nil, когда я устанавливаю prefersLargeTitles.

Должен ли я обновлять это свойство в другом месте? Или мне следует подать радар?

Обновление:

Похоже, это происходит только в том случае, если мое представление содержит UITableView или само является UITableViewController.

Комментарии к вопросу (9)

У меня была та же проблема. Хотя вы не используете раскадровки, но я надеюсь, что это может помочь кому-то. Я проверил, что "предпочитают большие титулы" и для контроллера навигации (не представление-контроллер) я встраивал в TableViewController. Всех вид контроллеров после контроллер навигации повернулся и крупными заголовками, и он должен работать.

Комментарии (2)

У меня был тот же вопрос, только на один TableView для ...

Я должен был установить :

self.tableView.contentInsetAdjustmentBehavior = .never

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

Это'ы TableView для автоматической прокрутки, что делает большой заголовок скрытый

Надеюсь, что это помогает

Комментарии (2)

Я недавно попал в тот же вопрос и ни один вариант не работал для меня. Вместо этого, все, что мне нужно сделать, чтобы вызвать sizeToFit()`. Пример кода:

private func configureNavigator() {
    guard let navigationController = navigationController else { return }
    navigationController.navigationBar.prefersLargeTitles = true
    navigationItem.largeTitleDisplayMode = .automatic
    navigationController.navigationBar.sizeToFit()
}

Я надеюсь, что это помогает!

Комментарии (2)

Изменение contentInset из TableView с топ:1 заставит виджет navigationbar, чтобы развернуть и отобразить большие титулы.

Параметр Obj-C В

-(void) viewWillAppear:(BOOL)animated {
    if (@available(iOS 11.0, *)) {
        tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0);
    }
}

Свифт

override func viewWillAppear(_ animated: Bool) {
    if #available(iOS 11.0, *) {
        tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0)
    }
}

Примечание: Если у вас есть TableView для.reloadData()вviewWillAppearобязательно вызовите его после редактированияcontentInset`

Комментарии (0)

В моем случае решение было установить TableView для's топ присоединяются к безопасной зоне и не Суперпанель

Комментарии (2)

Я потратил значительное количество времени на это, как prefersLargeTitle` сага работает на некоторых вид контроллеров, как ожидалось, и с какой это производит один и тот же вопрос выше.

Решение для меня было, чтобы снять удлиненных кромок под верхней решеткой в ИБ - для тех, вид контроллеров, которые показывают крупным заголовком на мгновение, пока содержимое табличном представлении не загружается навигации возвращается до обычного размера. Это только показывает большой заголовок при прокрутке таблицы вниз.

Это обратная совместимость с iOS 10 и не оставляет пустого пространства выше первой строки в таблице.

Я проверил `prefersLargeTitle на контроллеры навигации атрибутами инспектора только в ИБ - ничего в коде. Же для largeTitleDisplayMode = .всегда

Что касается того, почему это происходит с некоторым видом контроллеров, а не другие, я понятия не имею!

Комментарии (0)

Я решил эту проблему с помощью раскадровки

  1. Навигационный контроллер -> По панели навигации -> инспектор -&атрибутами ГТ; предпочитает большие заголовки(проверено)
  2. Контроллер-просмотр> В навигации пункт -> атрибуты инспектора -> крупный заголовок (автоматическая или всегда проверяется)
Комментарии (0)

Я столкнулся с той же проблемой и обнаружили, что это обычно лучше, чтобы установить свойство `prefersLargeTitles от контроллера представления или объект, который устанавливает его, и сделать это прежде, чем это преподносится.

Например, если контроллер представления в вопросе отображается при запуске приложения:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let window = UIWindow(frame: UIScreen.main.bounds)

    let someViewController: UIViewController = CustomViewController()

    let theNavController = UINavigationController(rootViewController: someViewController)
    theNavController.navigationBar.prefersLargeTitles = true

    window.rootViewController = theNavController
    window.makeKeyAndVisible()

    return true
}

или если представлять конкретное представление-контроллер:

let someViewController: UIViewController = CustomViewController()

let theNavController = UINavigationController(rootViewController: someViewController)
theNavController.navigationBar.prefersLargeTitles = true

present(theNavController, animated: true, completion: nil)

Я нашел этот метод, чтобы быть более верный способ гарантировать, что заголовок навигации отображается соответственно. Надеюсь, что это помогает! :)

Комментарии (1)

В раскадровке я установил для элемента навигации Large Title значение Never.

В методе ViewController'a viewDidLoad я установил следующее:

navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
Комментарии (2)

У меня только что возникла такая же проблема, и в моем случае оказалось, что структура Storyboard, которая работала в iOS 10 со Swift 3 (и также работает в iOS 11 со Swift 3), вызвала проблему в iOS 11 со Swift 4.

Более подробно:

У меня в сториборде был обычный UIViewController, который я установил в подкласс UINavigationController (моя иерархия похожа на вашу: подкласс UITabBarController → подкласс UINavigationController → подкласс UITableViewController).

В iOS 10 это работало нормально.

В iOS 11 это также работает нормально при запуске существующего приложения Swift 3.

Однако в приложении Swift 4, запущенном на iOS 11, я наблюдал те же симптомы, которые вы описали (крупные заголовки появляются только тогда, когда вы тянете/прокручиваете вид вниз).

Чтобы исправить ситуацию, я заменил элементы на базе UIViewController в Storyboard на реальные экземпляры UINavigationController (которые содержат UINavigationBar явно в Storyboard -  у меня есть предположение, что именно в этом кроется суть проблемы, поскольку у экземпляров UIViewController этот элемент не был явно объявлен в Storyboard).

В любом случае, это решило проблему для меня.

Я запишу радар, так как это похоже на регрессию на базе Swift 4, поскольку у меня это работает как в iOS 10 со Swift 3, так и в iOS 11 со Swift 3.

Комментарии (1)

Общие изменения поведения виджет navigationbar должно быть сделано вviewWillAppear(_:)`

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.prefersLargeTitles = true
}

После этого он работал штрафа для меня.

Комментарии (0)

Я думаю, что это выглядит немного манекен, но я эффективно решил проблему с этим:

self.navigationItem.prompt = ""

self.navigationItem.prompt = nil

Это's, как виджет navigationbar нуждается в своего рода обновление в одном из ее элементов, чтобы обновить макет.

Иногда, чтобы обновить что-то в виджет navigationbar мне нужно, чтобы скрыть и отобразить его.. что's, почему я думаю, что есть лучший способ сделать это.. на данный момент, что'мое решение.

Комментарии (0)

Программно:

  1. В Файле AppDelegate.Свифт:

``Свифт окно = UIWindow(каркас: UIScreen.главная.границы) окно?.makeKeyAndVisible()

пусть navigationController = UINavigationController.инит(rootViewController: файл ViewController()) окно?.rootViewController = navigationController ``

  1. В ViewController: ``Свифт переопределить функцию viewWillAppear(_ анимация: типа bool) { супер.viewWillAppear(анимированный)

navigationController?.виджет navigationbar.prefersLargeTitles = истина navigationItem.largeTitleDisplayMode = .автоматическая }

переопределить loadView кнопку func() { супер.loadView()

вид.с помощью addSubview(таблица) вид.с помощью addSubview(loadingView)

NSLayoutConstraint.активировать([ метод TableView.leadingAnchor.ограничение(получается: смотреть.safeAreaLayoutGuide.leadingAnchor), метод TableView.topAnchor.ограничение(получается: смотреть.safeAreaLayoutGuide.topAnchor), метод TableView.widthAnchor.ограничение(получается: смотреть.safeAreaLayoutGuide.widthAnchor), метод TableView.heightAnchor.ограничение(получается: смотреть.safeAreaLayoutGuide.heightAnchor) ]) } ``

Убедитесь, что ваш таблица ранее бид добавлен в ваш вид.

Комментарии (1)

У меня была аналогичная проблема с навигационной панели, но в моем случае это был пользовательский заголовок вид, и навигационная панель остается пустой пока стол прокрутке вниз, что спровоцировало UILayoutContainerView макет подпанелей, один из которых навигационный контроллер's посмотреть и навигации. Я предполагаю, что корень такой же, как и большой заголовок вопроса навигации.

Якорь таблица к safeAreaLayoutGuide не't работа для меня, largeTitleDisplayMode не могу'т быть другой тогда.никогда

Так мне удалось исправить это путем вызова "я".navigationController?.вид.setNeedsUpdateConstraints в верхней представила контроллер'viewDidAppear с (анимированный:) функция, или планирование этого звонка на следующий цикл выполнения в viewWillAppear(анимированный:)`, например: Свифт DispatchQueue.главная.асинхронность { самовывоз.navigationController?.вид.setNeedsUpdateConstraints() }

В этом случае, появилась навигационная панель с правильное содержание и размер представления вместе с экономикой, а не появляться после перехода был завершен

Комментарии (0)

У меня была аналогичная проблема. Вид вид таблицы. Свойство prefersLargeTitles расположен в метод viewDidLoad событие. Затем я вид's название в viewWillAppear` событие.

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

override open func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "something"
    ...
}

В моей подготовке мероприятия переход, я поставил навигации пункт'ы плитку на "ноль", так что в следующий вид навигации слева ВАР пункта отображает и"Назад" и автоматически.

override func prepare(for segue: UIStoryboardSegue,
                      sender: Any?) {
    self.navigationItem.title = nil
    ...
}

Первый раз, когда представление таблицы правильно отображает большие звания. Однако, если я выберите строку для следующего просмотра и обратно в вид таблицы, в навигации пункт's название пустеет.

После нескольких часов' изо всех сил, я, наконец, выяснить, что посмотреть's название должно быть установлено в viewDidAppear событие! Кажется, что все, что установлено для просмотра's название В будет событие будет сброшено программирования с использованием UIKit внутренне вернуться к нулю. Поэтому он должен быть задан в другом случае.

override func viewDidAppear(_ animated: Bool) {
   self.navigationItem.title = "something"
   ...
}

override open func viewWillAppear(_ animated: Bool) {
    // self.navigationItem.title = "something" // Remove it and set title in Did event!
    ...
}

Прежде чем я представил это iOS 11 новая функция, мое приложение работает нормально. Похоже, что новая функция имеет некоторые изменения в UIKit, так что предыдущие версии приложения может потребоваться некоторые обновления/изменения, чтобы сделать его работу.

Комментарии (0)

У меня была та же проблема и починил его путем изменения порядка представления в моем файле ViewController в InterfaceBuilder.

Кажется, что если первый вид в иерархии не представление ScrollView тогда виджет navigationbar появляется в режиме LargeTitle и не анимируется вместе с прокрутки. Если вам нужно, чтобы заголовок панели навигации, чтобы отразить свой свиток, то вам нужно положить свой вид прокрутки в качестве первого в иерархии представления.

Кроме того, я не совсем уверен в этом, но похоже, навигации внешний вид бар в стандартном или большом режиме название зависит от иерарха вид контроллера.

Комментарии (0)

Подобный вопрос для меня с UITableViewController добавлен для UIViewController. В моем экземпляре, эти представления контроллеры, сами врезали в UITabBarController и корректно отображается только первая вкладка используется большое название. Другие вкладки требуется ручная прокрутка перед крупным заголовком был показан.

Единственное, что я мог сделать, чтобы работа была регулировка `contentInset на @Пау-senabre'ы ответ, кроме того, что я "сверху" инсет было'т полезно для меня. Вместо этого, я поставил вставку "левых", а затем сбросить его на следующий runloop.

private var isFirstAppearance = true

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if isFirstAppearance {
        applyLargeTitlesFix()
    }
}

private func applyLargeTitlesFix() {
    let originalInset = tableViewController.tableView.contentInset
    tableViewController.tableView.contentInset = UIEdgeInsets(top: 0, left: 1, bottom: 0, right: 0)
    DispatchQueue.main.async { [weak self] in
        self?.tableViewController.tableView.contentInset = originalInset
    }
    isFirstAppearance = false
}
Комментарии (0)

Еще одним возможным решением является прекращение обновления в refreshHandler(). как это-

@objc func refreshPage() {
    self.refreshControl?.endRefreshing() //End here
    self.loadTableData() //Get fresh data and reload table
}
Комментарии (0)

Же проблема с быстрым 4.2, прошивкой 12, и рефакторингу раскадровки.

Пробовал добавлять `prefersLargeTitles = True " на "viewWillAppear" и " метод viewDidLoad, но не фиксированная моя проблема.

Вместо этого я скопировал рефакторингу раскадровки обратно в основную.раскадровка и нашли возможность включить большие звания в ПБ. Установите эту опцию, затем рефакторинг раскадровки обратно и все работает теперь. По какой причине первоначальный рефакторинг исключается возможность и я не мог'т включить его программно.

Комментарии (0)

Сначала это кажется странным, но попробуйте установить для navigationItem.largeTitleDisplayMode значение always. По умолчанию стоит автоматический - и в документации не определено, как это работает.

Также написал/обновлю ответ о больших заголовках здесь.

Комментарии (1)