Ячейка TableView: конфликты изменений ограничений tableView.endUpdates () - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть приложение для обмена сообщениями, написанное на 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, все будет работать нормально.Я не очень понимаю, почему.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Попробуйте использовать следующий код, чтобы преодолеть проблему щелчка

tableView.scrollToRow(at: indexPath, at: UITableView.ScrollPosition.middle, animated: true)

Альтернативное решение попробуйте использовать этот красивый метод для обновления вашей ячейки с анимацией вместо beginUpdates () и методы endUpdates ()

tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.bottom )
0 голосов
/ 22 декабря 2018

Эта анимация может быть липкой.

Я думаю, что ваша главная проблема здесь - пузырьки сжимаются больше, чем следовало бы.Если вы запустите анимацию в режиме медленная анимация (кстати, у симулятора есть эта опция, очень полезная для отладки), вы заметите:

Bubble shrink

Чтобы разобраться в этом, вы можете сделать вашу метку вертикальными резисторами сжатия контента выше, и проверить, чтобы метка имела верхнее и нижнее ограничения с приоритетом Hi, поэтому она не будет обрезана таким образом.

https://medium.com/@abhimuralidharan/ios-content-hugging-and-content-compression-resistance-priorities-476fb5828ef

...