У меня есть приложение для обмена сообщениями, написанное на Swift.
В нем есть пузырьки сообщений: if the message is longer than 200 chars
оно сокращается.
Всякий раз, когда пользователь нажимает навыбирается сообщение:
- Если сообщение было сокращено, я заменяю текст оригинальным длинным текстом: поэтому мне нужно позвонить
tableView.beginUpdates()
и tableView.endUpdates()
- Кроме того, мне нужно изменить ограничение высоты timeLabel с помощью
UIView.animate()
Но эти два, кажется, конфликтуют друг с другом и создают странную анимацию: (посмотрите в конец)
https://youtu.be/QLGtUg1AmFw
Код:
func selectWorldMessage(indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) as? WorldMessageCell {
cell.messageLabel.text = data[indexPath.row].originalMessage
self.lastContentOffsetY = self.tableView.contentOffset.y
self.tableView.beginUpdates()
UIView.animate(withDuration: duration) {
cell.timeLabelHeightConstraint.constant = 18
cell.layoutIfNeeded()
}
self.tableView.endUpdates()
self.lastContentOffsetY = nil
cell.layoutIfNeeded()
WorldMessageIdsStore.shared.nearby.saveCellHeight(indexPath: indexPath, height: cell.frame.size.height, expanded : true, depending: indexPath.section == 1 ? true : false )
}
}
@objc func deselectSelectedWorldMessage(){
if (currentSelectedIndexPath == nil){
return
}
let indexPath = currentSelectedIndexPath!
tableView.deselectRow(at: indexPath, animated: false)
if let cell = tableView.cellForRow(at: indexPath) as? WorldMessageCell {
cell.messageLabel.text = data[indexPath.row].shortenedMessage
self.lastContentOffsetY = self.tableView.contentOffset.y
self.tableView.beginUpdates()
UIView.animate(withDuration: duration) {
cell.timeLabelHeightConstraint.constant = 0
cell.layoutIfNeeded()
}
self.tableView.endUpdates()
self.lastContentOffsetY = nil
cell.layoutIfNeeded()
}
currentSelectedIndexPath = nil
}
Есть ли способ анимировать изменение высоты ячейки и ограничение одновременно?
Могу ли яне помещайте self.tableView.beginUpdates()
и self.tableView.endUpdates()
в часть UIView.animate(){ ... }
, так как это приведет к мерцанию новых появляющихся строк.
.,.
ОБНОВЛЕНИЕ 1
Итак, если я поместу self.tableView.beginUpdates()
и self.tableView.endUpdates()
в UIView.animate(){ ... }
, анимация будет работать нормально.Но, как я уже упоминал, это вызывает мерцание, когда появляются новые строки.
Видео:
https://youtu.be/8Sex3DoESkQ
ОБНОВЛЕНИЕ 2 !!
Итак, если я установлю длительность UIview.animate
на 0.3
, все будет работать нормально.Я не очень понимаю, почему.