如何为UITableViewCell实现展开收起的平滑动画效果?
解决UITableViewCell展开/收起无动画的问题
问题根源
你当前的代码逻辑框架是对的,但缺少关键的自动高度配置,且布局刷新的时机和方式不够精准,导致cell高度变化时没有触发动画效果。
具体修正步骤
1. 开启UITableView自动高度计算
在tableView的初始化代码或viewDidLoad中添加以下配置,这是实现动态高度动画的基础:
tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 120 // 设置与初始cell高度接近的预估数值,可根据实际UI调整
2. 修正Cell内的按钮点击方法
调整布局刷新时机,确保label先完成布局更新,再通知tableView刷新:
func buttonTap() { // 切换展开/收起状态 textIsHide.toggle() // 更新label显示行数 descriptionLabel.numberOfLines = textIsHide ? 3 : 100 // 更新按钮文字 let titleKey = textIsHide ? "posters_postercard_showmore" : "posters_postercard_hide" button.setTitle(.localized(for: titleKey), for: .normal) // 先让label完成布局更新,确保tableView能计算出正确的新高度 descriptionLabel.layoutIfNeeded() // 通知刷新当前cell delegate?.reloadRows(for: self) }
3. 优化tableView的刷新逻辑
修改delegate方法,精准刷新当前cell,避免全局更新导致的动画异常:
// 先更新Delegate协议定义,添加cell参数 protocol PosterCardDataManagerDelegate: AnyObject { func reloadRows(for cell: UITableViewCell) } // 实现刷新逻辑 extension PosterCardView: PosterCardDataManagerDelegate { func reloadRows(for cell: UITableViewCell) { guard let indexPath = tableView.indexPath(for: cell) else { return } // 用performBatchUpdates包裹刷新操作,确保动画稳定生效 tableView.performBatchUpdates({ tableView.reloadRows(at: [indexPath], with: .automatic) }, completion: nil) } }
4. 额外注意
确保descriptionLabel的lineBreakMode设置为.byTruncatingTail,这样收起状态下会正常显示省略号,符合交互预期。
内容的提问来源于stack exchange,提问作者Mikl.hart
相关产品推荐
相关产品推荐

