iOS 11 прокрутка вверх при использовании больших названий не работает должным образом - PullRequest
0 голосов
/ 31 мая 2018

При использовании больших заголовков и нажатии строки состояния для прокрутки к вершине UIScrollView или UITableView (вероятно, также UICollectionView, не проверял это), оно всегда заходит слишком далеко.

У меня включено обновление на TableView, и при касании строки состояния оно выглядит примерно так и будет оставаться до тех пор, пока я не коснусь экрана.

enter image description here

У меня есть ScrollView в другом ViewController, и если я коснусь там строки состояния, она также прокручивается слишком далеко, делая панель навигации слишком высокой.Это также возвращается к норме, когда я нажимаю куда-то или прокручиваю чуть-чуть.

Нормальный: enter image description here

После того, как я коснулся строки состояния: enter image description here

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

Есть идеи, как это исправить?

Как воссоздать:

  1. Создайте новый проект с контроллером навигации и UIViewController с TableView внутри.
  2. Установите контроллер навигации на большой размерназвания.Выключите полупрозрачный.Установить заголовок на UIViewController
  3. Установить ограничения на TableView, чтобы закрепить края ViewController
  4. Создать выход для TableView в ViewController
  5. Реализация делегатов и установка количества строк, например, 100
  6. Запустите приложение
  7. Прокрутите вниз, чтобы большой заголовок стал обычным заголовком
  8. Коснитесь строки состояния, чтобы tableView прокрутка к вершине

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

ViewController код:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }

}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 100
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TestCell", for: indexPath)

        return cell
    }

}

Ответы [ 4 ]

0 голосов
/ 09 августа 2019

В вашем ViewController объявите переменную didBeginScrollToTop типа Bool.Назначьте контроллер как делегат scrollView.Тогда

func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
    didBeginScrollToTop = true
    return true
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard didBeginScrollToTop, scrollToTopGestureTargetView?.contentOffset.y ?? 0 < -25 else { return }

    scrollToTopGestureTargetView?.setContentOffset(.zero, animated: true)
}

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    didBeginScrollToTop = false
}

Что это делает, так это корректирует смещение вашего контента при отскоке.Флаг для захвата жеста scrollToTop и сбрасывается при прокрутке.Вы также можете отключить его после установки смещения .zero.Если у вас есть реализация с дочерними VC, не забудьте вызвать super при переопределении этих трех методов делегата.Теперь мой первый подход состоял в том, чтобы отслеживать, когда контент offSet равен <0, но на некоторых устройствах он не расширяет элемент навигации, и эта магия -25, похоже, работает на всех симуляторах.Вы можете объединить этот подход с реализацией, которая возвращает размер навигационной панели и заменяет ее, но, насколько я знаю, не было простого способа получить рамку / границы навигационной панели так легко. </p>

Обратите внимание, что вам, возможно, придется справиться и с этим: Странная скорость предпочитает большой заголовок

0 голосов
/ 17 ноября 2018

После многих часов тестов я нашел решение, которое работает с UIViewController.

В UIViewController с UITableView вы должны:

  • в viewDidLoad установить extendedLayoutIncludeOpaqueBars = true
  • в расстановке контактов раскадровки tableView сверху к верху суперпредставления с константой = 0 (tableView будет под панелью навигации и строкой состояния, когда панель навигации полупрозрачна)

После этого, если вы нажмете на строке состояния, просмотр таблицы остановится справаместо.

enter image description here

0 голосов
/ 05 апреля 2019

Я исправил это, вручную установив contentOffset в 0 после прокрутки вверх.

func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
    return true
}

func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = 0.0
}
0 голосов
/ 01 июня 2018

Хорошо, я нашел причину проблемы, а не то, как ее исправить в этом конкретном сценарии.

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

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

Редактировать

Оказывается, настройка "extendedLayoutIncludesOpaqueBars = true" устраняет проблему, если вы используете полупрозрачную панель навигации!

Аналогичный вопрос: UIRefreshControl () в iOS 11 Эффект Glitchy

...