Я вставляю / удаляю ячейку таблицы, используя insertRowsAtIndexPaths/deleteRowsAtIndexPaths
упаковку beginUpdates/endUpdates
. Я также использую beginUpdates/endUpdates
при настройке rowHeight. По умолчанию все эти операции анимированы.
Как я могу определить, что анимация закончилась при использовании beginUpdates/endUpdates
?
iphone
objective-c
ios
ipad
pixelfreak
источник
источник
-scrollToRowAtIndexPath:atScrollPosition:animated:
.Ответы:
Как насчет этого?
Это работает, потому что анимация tableView использует
CALayer
анимацию внутри. То есть они добавляют анимацию к любому открытомуCATransaction
. Если открытых неCATransaction
существует (нормальный случай), то неявно начинается одно, которое заканчивается в конце текущего цикла выполнения. Но если вы начнете один, как здесь, то он будет использовать его.источник
completionBlock
ранееbeginUpdates
иendUpdates
нравится во фрагменте?[CATransaction commit]
следует называть после, а не до[tableView endUpdates]
.Быстрая версия
источник
Если вы ориентируетесь на iOS 11 и выше, вам следует использовать
UITableView.performBatchUpdates(_:completion:)
вместо этого:источник
Возможным решением может быть наследование от UITableView, для которого вы вызываете,
endUpdates
и перезапись егоsetContentSizeMethod
, поскольку UITableView настраивает размер своего содержимого в соответствии с добавленными или удаленными строками. Этот подход также должен работать дляreloadData
.Чтобы уведомление отправлялось только после
endUpdates
вызова, можно также перезаписатьendUpdates
и установить там флаг.источник
Вы можете заключить свои операции в блок анимации UIView следующим образом:
Кредиты на https://stackoverflow.com/a/12905114/634940 .
источник
endUpdates
, но до завершения анимации.Пока не нашел хорошего решения (если не считать подкласса UITableView). Решил
performSelector:withObject:afterDelay:
пока использовать . Не идеально, но выполняет свою работу.ОБНОВЛЕНИЕ : похоже, я могу использовать
scrollViewDidEndScrollingAnimation:
для этой цели (это относится к моей реализации, см. Комментарий).источник
scrollViewDidEndScrollingAnimation
вызывается только в ответ наsetContentOffset
andscrollRectToVisible
Вы можете использовать
tableView:willDisplayCell:forRowAtIndexPath:
как:Но это также будет вызвано, когда ячейка, которая уже находится в таблице, перемещается с экрана на экран, поэтому это может быть не совсем то, что вы ищете. Я просто просмотрел все методы
UITableView
иUIScrollView
делегировать, и, похоже, нечего обрабатывать сразу после вставки анимации в ячейку.Почему бы просто не вызвать метод, который вы хотите вызвать, когда анимация заканчивается после
endUpdates
?источник
willDisplayCell
что сработает. Мне нужно, чтобы это произошло после анимации, потому что визуальное обновление нужно делать только после того, как все уляжется.