Недавно я перенес код на новый SDK iOS 11 beta 5.
Теперь я получаю очень запутанное поведение от UITableView. Само по себе tableview не такое уж и красивое. У меня есть нестандартные ячейки, но по большей части это просто для их высоты.
Когда я нажимаю на свой контроллер представления с помощью tableview, я получаю дополнительную анимацию, в которой ячейки «прокручиваются вверх» (или, возможно, изменяется весь кадр tableview) и вниз вместе с анимацией навигации push / pop. См. Gif:
Я вручную создать tableview
в loadView
методе и автоматическая настройка макета ограничений равного ведущий завершающий, верхний, нижнюю надтаблицы Tableview в. Супервизор является корневым представлением контроллера представления.
Код отправки контроллера представления очень стандартный: self.navigationController?.pushViewController(notifVC, animated: true)
Тот же код обеспечивает нормальное поведение на iOS 10.
Не могли бы вы указать мне, что не так?
РЕДАКТИРОВАТЬ: Я сделал очень простой контроллер tableview, и я могу воспроизвести там то же поведение. Код:
class VerySimpleTableViewController : UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = String(indexPath.row)
cell.accessoryType = .disclosureIndicator
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let vc = VerySimpleTableViewController.init(style: .grouped)
self.navigationController?.pushViewController(vc, animated: true)
}
}
РЕДАКТИРОВАТЬ 2: мне удалось сузить проблему до моей настройки UINavigationBar. У меня есть такая настройка:
rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)
где createFilledImage
создает квадратное изображение заданного размера и цвета.
Если я закомментирую эту строку, я вернусь к нормальному поведению.
Буду признателен за любые мысли по этому поводу.
navigationBar.isTranslucent
вfalse
противном случае он работает отлично.Ответы:
Это связано с новым свойством
UIScrollView's
(UITableView является подклассом UIScrollview)contentInsetAdjustmentBehavior
, для которого.automatic
по умолчанию установлено значение.Вы можете переопределить это поведение с помощью следующего фрагмента в viewDidLoad всех затронутых контроллеров:
https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
источник
tableView.contentInsetAdjustmentBehavior
приведет к поломке вставок.contentInsetAdjustmentBehavior
для.never
не большой обходного пути , потому что он, вероятно , есть и другие нежелательные побочные эффекты. Если вы используете обходной путь, обязательно удалите его для версий iOS> = 11.2.В дополнение к ответу Мэгги
Objective-C
источник
Вы можете редактировать это поведение сразу во всем приложении, используя NSProxy, например, в didFinishLaunchingWithOptions:
источник
Вот как мне удалось исправить эту проблему , сохранив при этом возможность автоматической установки вставок в iOS 11 . Я использую
UITableViewController
.tableView.insetsContentViewsToSafeArea = true
) - Возможно, в этом нет необходимости, но я так и сделал.tableView.contentInsetAdjustmentBehavior = .scrollableAxes
) -.always
также может работать, но я не тестировал.Еще одна вещь, которую стоит попробовать, если ничего не помогает:
Переопределить
viewSafeAreaInsetsDidChange
UIViewController
метод, чтобы заставить представление таблицы принудительно установить вставки представления прокрутки на вставки безопасной области. Это связано с настройкой «Никогда» в ответе Мэгги.Примечание:
self.tableView
иself.view
должно быть то же самое дляUITableViewController
источник
Это больше похоже на ошибку, чем на предполагаемое поведение. Это происходит, когда панель навигации не полупрозрачна или когда установлено фоновое изображение.
Если вы просто установите для contentInsetAdjustmentBehavior значение. Never, вставки содержимого не будут правильно настроены на iPhone X, например, содержимое перейдет в нижнюю область под полосами прокрутки.
Необходимо сделать две вещи:
1. предотвратить анимацию scrollView при нажатии / попа
2. сохранить .automatic поведение, потому что это необходимо для iPhone X. Без этого, например, в портретной ориентации, контент будет перемещаться ниже нижней полосы прокрутки.
Новое простое решение: в XIB: просто добавьте новый UIView поверх основного представления с верхним, ведущим и конечным пунктами супервизора и высотой 0. Вам не нужно подключать его к другим подпредставлениям или чему-то еще.
Старое решение:
Примечание. Если вы используете UIScrollView в ландшафтном режиме, он по-прежнему неправильно устанавливает горизонтальные вставки (еще одна ошибка?), Поэтому вы должны закрепить ведущую / конечную точку scrollView в safeAreaInsets в IB.
Примечание 2: В приведенном ниже решении также есть проблема, заключающаяся в том, что если tableView прокручивается вниз, а вы нажимаете контроллер и возвращаетесь назад, он больше не будет внизу.
источник
Я могу воспроизвести ошибку для iOS 11.1, но кажется, что ошибка исправлена, начиная с iOS 11.2. См. Http://openradar.appspot.com/34465226
источник
убедитесь, что вместе с приведенным выше кодом добавьте дополнительный код следующим образом. Это решило проблему
источник
Также, если вы используете панель вкладок, нижняя вставка содержимого представления коллекции будет равна нулю. Для этого введите в viewDidAppear код ниже:
источник
В моем случае это сработало (поместите в viewDidLoad):
источник
Удаление лишнего места в верхней части
collectionView
илиtableView
Над кодом
collectionView
илиtableView
идет под панелью навигации.Код ниже не позволяет отображать коллекцию под навигацией
но я люблю использовать приведенную ниже логику и код для UICollectionView
Лучший способ для UICollectionView
источник
Удалить этот код работает для меня
источник
Я использовал UISearchController с настраиваемыми контроллерами результатов, которые имеют табличное представление. Нажатие нового контроллера на контроллер результатов заставило tableview перейти в поиск.
Приведенный выше код полностью устранил проблему.
источник