iOS 类似聊天页面 tableView在出现时自动滚动到底部(不闪动,无痕)

在iOS开发聊天界面时,为了实现进入页面即显示最新消息,通常需要将UITableView滚动到底部。通过在viewDidAppear中调用`scrollToRow`方法可能会导致动画效果不佳或闪动问题。文中提出一种解决方案,利用RxSwift监听tableView.contentSize变化,当内容大小确定后才执行滚动操作,以避免不必要的动画和闪动,确保用户体验的平滑性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS在开发类似聊天的页面时,需要进入页面,直接展示最新的数据。而最新数据在最底部,因此需要一进入页面,tableView直接展示在最底部位置。

滚动代码:self.tableView.scrollToRow(at: IndexPath(row: tempModels.count - 1, section: 0), at: .bottom, animated: false)

只能在viewDidAppear中调用,在viewDidLoad中或viewWillAppear中调用,不起作用。而在viewDidAppear中调用,无论animated是true或false,效果都不尽如人意。或有滚动动画,或有闪动。

百度了一圈,发现答案高度重复,在tableView数据源方法 numberOfRowsInSection中设置。但个人觉得此方式不够优雅,还会调用多次。但文章提供了很好地思路,就是contentSize确定后,才可以调用ScrollToRow方法。

因此考虑监听tableView.contentSize属性变化,当属性变化时滚动到底部。并加变量控制只在页面刚进入时调用。

我使用了RxSwift。当然,用iOS的KVO一样。目标是监听contentSize属性变化就行。
firstLoad设置成false的时机,需根据具体情况来写。因为我这里数据是从初始化方法里直接传进来的。如果数据是从网络获取的,可以写在网络请求成功的回调里。

具体代码如下:

class TestViewController: UIViewController {
   

	@IBOutlet weak var tableView: UITableView!
	
	private var isFirstLoad: Bool =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值