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

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

Эта проблема НЕ возникает при использовании UITableViewController.

Это нормальное, ожидаемое поведение при прокрутке внутри UITableViewController.

iOS 11 UITableView inside of a UIViewController (broken abrupt transition when scrolling)

И вот разбитый, резкий переход при использовании UITableView внутри UIViewController.

iOS 11 UITableViewController (transitioning properly)

Вот код для сломанной реализации:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

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

        cell.textLabel?.text = "Title \(indexPath.row)"

        return cell
    }

}

На панели навигации есть предпочтения "Большие заголовки", а элемент "Навигация" имеет значение " Большой заголовок", установленное на "Автоматически".

Код и конфигурация для обоих приведенных выше примеров точно такие же, за исключением того, что он является UITableViewController и UITableView внутри UIViewController.

Я также заметил, что сломанное поведение НЕ происходит, если содержимое UITableView не превышает высоту представления. Но раз больше ячеек, чем может поместиться на экране, это ломается.

Любая идея, если я делаю что-то неправильно или это ошибка IOS 11?

Ответ 1

Я столкнулся с той же проблемой - у меня был UIViewController, встроенный в UINavigationController, у UIViewController было табличное представление с ограничениями в начале, в конце, сверху и снизу в безопасную зону. Весь табличный вид вел себя нервно. Хитрость заключалась в том, чтобы изменить верхнее ограничение таблицы на superview.

Здесь я записал изменение ограничения Изменение ограничения на ошибку в iOS 11 для таблицы

Ответ 2

Поместите эту строку кода на свой UIViewController, содержащий UITableView, и отлично справится со мной.

стриж

extendedLayoutIncludesOpaqueBars = true;

Objective-C

self.extendedLayoutIncludesOpaqueBars = YES;

Установите верхнее пространство UITableView AutoLayout на "Superview" вместо "Safe Area"

Ответ 3

У меня была аналогичная проблема и она была решена путем удаления UINavigationBar.appearance().isTranslucent = false из моего AppDelegate.

Ответ 4

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

  1. Выберите ваш "viewController".
  2. Атрибуты Инспектора отметки "Под непрозрачными слитками" и "Под верхними слитками".
  3. Сделайте ваши верхние ограничения вашего второго элемента scrollView "SuperView", а не "SafeArea".

Это работало со мной.

Ссылка

Ответ 5

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

    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)
    ])

в viewDidLoad.

Оригинальный ответ: fooobar.com/info/14788281/...