Nano Hash - криптовалюты, майнинг, программирование

UITableViewCell не имеет правильного размера на iPhone X под управлением iOS 11

У меня есть UITableViewCell, содержащий только метку внутри. Метка ограничивается всеми полями ячейки (верхним, нижним, конечным и ведущим). Это многострочная метка (lines = 0) со статическим текстом, который будет занимать несколько строк на экране iPhone X как в альбомной, так и в портретной ориентации.

Вот скриншот IB с ограничениями.

Количество строк в коде установлено на 30. (Достаточно ячеек, чтобы всегда занимать экран)

Я реализовал все вышеперечисленное в новом проекте. Большая часть этого делается в IB, а подкласс UITableViewController содержит только два метода, numberOfRowsInSection и cellForRowAt indexPath. Проект был создан на Xcode 9 с Swift 4, а устройство работает на iOS 11.2.

Вот код для подкласса UITableViewController

class ViewController: UITableViewController {

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

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

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

Это происходит только на iPhone X. Ячейки расположены так, как и ожидалось на всех других iPhone.

Кроме того, этого не происходит ни в одном из моих старых проектов (созданных с использованием Xcode 8).

При запуске VC

После поворота в альбомную ориентацию и обратно

beforeпосле

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

Будем признательны за любой вклад... Спасибо!

ИЗМЕНИТЬ:

Как отметил Брэндон, это происходит только тогда, когда UITableViewController встроен в UINavigationController. UITableView в UIViewController, встроенном в UINavigationController, показывает правильное поведение. И UITableViewController вне UINavigationController также ведет себя так, как ожидалось.


  • Нет кода, нет ответа. Мы не можем догадаться, что происходит в вашем коде.. По крайней мере, предоставьте образец, чтобы мы могли воспроизвести проблему. 08.01.2018
  • Я добавил скриншот IB и соответствующий код. Это должно предоставить вам достаточно информации, чтобы воссоздать то, с чем я столкнулся. 08.01.2018

Ответы:


1

Хм.. Я могу воспроизвести это в 100% случаев.. Это очень странно, потому что, если UITableViewController НЕ встроен в UINavigationController, тогда все работает.. во вторую секунду, когда он встроен, он демонстрирует поведение, показанное в вашем посте..

Чтобы исправить это, я сделал:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .automatic)
}

Это работает, но это не идеальная перезагрузка все время.. Другого решения пока не нашел.. Пока это происходит только с UITableViewController, встроенным в UINavigationController.. Не происходит с UITableView внутри UIViewController, встроенным в UINavigationController.. Это очень специфичен для Table Controller.

Мне это кажется ошибкой. Я просмотрел почти все параметры раскадровки и не нашел никаких решений.

08.01.2018
  • Я согласен; это похоже на ошибку в UIKit. 08.01.2018
  • Следует ли рассматривать это как ошибку и сообщать об этом Apple? 08.01.2018
  • У меня есть табличное представление в UIViewController, встроенное в UINavigationController, при повороте в iPhonex заголовок табличного представления исчезает, метод делегата titleForHeader не вызывается. 30.05.2018

  • 2

    Кажется, что с помощью

    if #available(iOS 11.0, *) {
        view.insetsLayoutMarginsFromSafeArea = false
    }
    

    может помочь в подобных случаях.

    Я не знаю подробностей, но это может быть ошибка в UIKit, из-за которой поля макета становятся неправильными из-за безопасной области (которая в настоящее время является специальной на iPhone X).

    11.06.2018

    3

    Я столкнулся с похожей проблемой. Ячейки в UITableView меняли высоту при прокрутке, но только на iPhone X.

    Проблема явно связана с безопасной областью iPhone X. Мои ячейки таблицы содержат представление коллекции, а в ячейке представления коллекции в построителе раскадровки / интерфейса были отмечены эти два флажка безопасной области (вероятно, по умолчанию):

    поля раскадровки, которые нужно снять

    Снятие с них флажка привело к тому, что ограничения использовали «суперпросмотр» вместо «безопасной области», а размер ячеек таблицы больше не изменялся при прокрутке.

    18.07.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..