it-roy-ru.com

iOS 11 большой заголовок панели навигации неожиданная скорость

Я пытаюсь реализовать название новой большой панели навигации для iOS 11 в моем новом приложении. Вызывая ниже функции в viewDidLoad ():

navigationController?.navigationBar.prefersLargeTitles = truenavigationController?.navigationItem.largeTitleDisplayMode = .always

Я получаю то, что хотел. enter image description here

Но когда я начинаю прокручивать вверх (единственный вид внутри основного вида - это вид с прокруткой), прокрутка заставляет большой заголовок исчезать с большей скоростью, чем фактическая прокрутка пальцем. (то есть, если я переместлю 2 см на экране, представление прокрутки фактически прокручивает больше, чем 2 см, до тех пор, пока большой заголовок не уменьшится до "обычного" размера.)

Ниже приведен GIF моего приложения прокручивается. Я на самом деле очень мало двигаюсь, и он автоматически прокручивается вверх. Это отличается от приложений Apple (например, магазин приложений, показанный ниже моего приложения).

У кого-нибудь есть решение проблемы с этим ненормальным поведением?

enter image description here

enter image description here

Правка: По запросу я добавляю текущую иерархию просмотра. В моем коде нет ничего особенного, я просто установил заголовок и флаг для prefersLargeTitles.

enter image description here

35
Seop Yoon

Я отлаживал это в течение пары дней, и я нашел обходной путь.

Во-первых, что происходило?

Это UIScrollView не очень хорошо работает с largeTitle. Поскольку при просмотре прокрутки происходит прокрутка вверх, в то время как панель навигации становится меньше, прокрутка увеличивается в два раза по сравнению с фактической прокруткой.

Я подтвердил это намеренно установив:

scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5

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

if scrollView.contentOffset.y > 0 {
  if self.navigationController!.navigationBar.frame.size.height > 44.0 {
    scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
  }
}

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

ОБХОДНОЙ ПУТЬ

Проще говоря, вы НЕ МОЖЕТЕ использовать UIScrollView с большой панелью навигации iOS 11. Вместо этого вы должны использовать UITableViewController.
Поскольку мое представление состоит из нескольких горизонтальных UICollectionViews, растянутых по вертикали, я использовал UITableView с различными разделами для формирования пользовательского интерфейса с использованием раскадровки. Если вы используете UITableViewController, он работает так, как вам нужно.
AppStore и все другие нативные приложения Apple должны делать это таким образом.

8
Seop Yoon

Я решил проблему с этими ограничениями:

    NSLayoutConstraint.activate([
        scrollView.topAnchor.constraint(equalTo: view.topAnchor),
        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor)
        ])

Вы также должны установить это свойство в вашем подклассе UIViewController:

extendedLayoutIncludesOpaqueBars = YES
37
Roman

Я также нашел эту проблему.

в Интерфейсном Разработчике

  1. Выберите ваш "viewController"
  2. Галочки инспектора атрибутов "Under Opaque Bars" и "Under Top Bars"
  3. Сделайте ваши верхние ограничения вашего второго элемента scrollView "SuperView", а не "SafeArea"
21
user8637708

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

Для просмотра прокрутки посмотрите Apple документы, есть несколько новых переменных (например, contentInsetAdjustmentBehavior) для изменений безопасной области, которые были введены в iOS 11: - https://developer.Apple.com/documentation/uikit/uiscrollview

сделать панель навигации прозрачной

В viewDidLoad () попробуйте добавить:

navigationController?.navigationBar.isTranslucent = true

Или установите эту галочку в IB:

полупрозрачная галочка

6
JWhitey

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

V:|-[navbar]-[view]-|

поэтому при прокрутке кадр вашего вида меняется при изменении смещения контента и удваивает скорость.

extendedLayoutIncludesOpaqueBars = true должно помочь.

5
Artjom Bastun