Предотвращение появления просмотров из левого верхнего угла во время анимации в iOS
Иногда, когда ячейки таблицы отображаются в анимации, e, g, -[UIView viewWillAppear:animated]
с -[UITableView reloadData]
, содержимое внутри них появляется в верхнем левом углу (0, 0) до конечных кадров. Эта проблема также возникает и в других анимациях просмотра. Еще в прежние времена эта проблема не существовала. В одном обновлении iOS возникла проблема, но исходные позиции были случайными, обычно вне экрана. В другом обновлении iOS проблема стала детерминированной с начальной позицией (0,0).
Я попробовал [tableView layoutIfNeeded]
, [tableView.layer displayIfNeeded]
после [tableView reloadData]
и те, что находятся в ячейках в cellForRowAtIndexPath
. Что я пропустил?
Я загрузил образец проекта https://github.com/keithyipkw/ios-animation-bug . Чтобы надежно воспроизвести проблему, установите точку останова в viewWillAppear, перед reloadData. Потяните экран, чтобы показать сегодняшний центр. Запуск после сегодняшнего центра полностью заметен.
- как я могу оживить UIImageView, когда пользователь перетаскивает MKMapView?
- Правильно использовать CGAffineTransformMakeScale
- Почему эта простая анимация не работает на iOS 7?
- Анимация изменения кадра UICollectionView при вставке ячеек
- UIViewAnimation воспроизводится мгновенно, задержка игнорируется
- Как отслеживать анимацию в iOS UIView анимации
- UIView.animateWithDuration в Swift 2.0?
- Разрешающий вызов одного метода одновременно к методу категории ios (@synchronized)
- Несколько анимаций UIView
- Является ли контент, нарисованный drawRect, способным анимировать анимацию UIView?
- Используйте две разные UIViewAnimationCurves в одной анимации
- Какая лучшая техника для реализации постоянного анимированного фона в iOS?
- Анимация кадра и изменение макета UICollectionView
У меня тоже такая же проблема, это происходит, когда телевизор впервые отображает ячейки.
Это связано с тем, что ячейки создаются с начальным размером прототипа в раскадровке и затем изменяются по размеру на основе ширины телевизора. Чтобы избежать этого в cellForRowAtIndexPath
я устанавливаю ширину в ячейке как размер телевизора и принудительно устанавливаю автоматическое обновление макета ячейки, чтобы все элементы уже соответствовали этому размеру.
Я все еще не нашел реального решения, это скорее трюк, я надеюсь, что кто-то еще даст отзыв по вашему вопросу.
Исправление состоит в том, чтобы использовать ячейки dequeue и init с идентификаторами повторного использования. Он по-прежнему работает, когда ячейка появляется в первый раз. Магия заключается в dequeue и init с тем же ненулевым идентификатором.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; }