iOS 类似聊天页面 tableView在出现时自动滚动到底部(不闪动,无痕)
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 = trueprivate let disposeBag: DisposeBag = DisposeBag()/// 数据模型var models: [TestModel]?/// 初始化方法/// - Parameter models: 数据模型convenience init(models: [TestModel]) {self.init()self.models = models}override func viewDidLoad() {super.viewDidLoad()tableView.rx.observe(CGSize.self, "contentSize").subscribe(onNext: { [weak self] (contentSize) inguard let self = self else { return }if self.firstLoad {// 进入页面,自动滑到最新数据的位置if let tempModels = self.models, tempModels.count > 0 {self.tableView.scrollToRow(at: IndexPath(row: tempModels.count - 1, section: 0), at: .bottom, animated: false)}}}).disposed(by: disposeBag)}override func viewDidAppear(_ animated: Bool) {super.viewDidAppear(animated)firstLoad = false}
}
iOS 类似聊天页面 tableView在出现时自动滚动到底部(不闪动,无痕)相关推荐
- 小程序聊天对话,每次都显示最新消息(让页面自动滚动到底部)
//页面自动滚动到底部pageScrollToBottom:function(){wx.createSelectorQuery().select('#scrollpage').boundingClie ...
- 【移动端聊天功能模板】Vue实现H5聊天系统,实现上下固定中间滚动布局,微信授权功能,自动滚动到底部【详细注释,一看就会】
前言 最近刚好在做这方面的功能,就网上看了下,发现很多种写法,但是有些写的很乱, 我也看的很麻烦,干脆就自己写一个简单的静态版本放在这, 以后需要用到的时候可以直接拿着改改就能用. 后面我还会继续更新 ...
- 微信小程序 页面如何自动滚动到底部
1.页面增加标签<scroll-view></scroll-view> 2.写函数: // 页面滚动到底部pageScrollToBottom: function() {wx. ...
- js监听页面或元素scroll事件,滚动到底部或顶部
基本原理: 1.滚动到底部 元素的滚动距离 + 元素的可视距离 == 元素的滚动条总距离2.滚动到顶部 元素的滚动距离 == 0 监听页面滚动 <!DOCTYPE html> <ht ...
- 微信小程序聊天界面进入自动滚动到底部,翻看历史聊天记录,收到的新消息不会马上置底,如收到新消息出现 底部有更多消息字样
重点看标红部分,其他代码只是写的上下逻辑,可忽略 wxml: <view style="position: relative;width: 100%;height: 100%;&quo ...
- [iOS] tableView中实现底部button出现时tableView的bottom自动向上偏移
这是我在工程中遇到的一个需求:选择照片之后,按bottomButton进行发送. 具体场景:照片存放在tableviewcontroller中,当选择照片之后,自动弹出bottomButton,点击之 ...
- IM 聊天页面下拉加载更多--类似微信顺滑展示
背景 领导在会议上说我们的 IM 聊天页面的用户体验不太好,尤其是下拉加载更多会跳动,让我优化一下.之前还确实没有注意到这一点,现场拿出手机和微信做对比,不比不知道,一比还真是发现了问题.微信 ...
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案
iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 (2)https://www.cn ...
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()
iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案-scrollIntoView() 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案- ...
最新文章
- html meta 跳转 白屏,vue使用keepAlive之后页面空白白屏?route和router什么区别呢?...
- webconfig的connectionStrings字段
- TensorFlow学习笔记(二十八)CNN的9大模型之AlexNet
- flexjava通信错误之一:Server.resource.unavailable
- 数学题 HDOJ——2086 简单归纳
- 二叉搜索树相关知识及应用操作
- MyBatis-Plus 学习笔记
- 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...
- python精度_通过Python可以达到的最高时间精度范围是多少?
- atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结
- qq不加好友实现网页在线聊天(qq在线客服)
- RTU和DTU的区别是什么?
- mysql中怎么防止数据丢失
- mac被锁有pin码的解锁方法
- atlsd.lib 和 atls.lib冲突
- 成功8要素Unveiling the Secrets of success in 8 words – Richard St. John’s 4 minute TED talk
- JS Array数组和函数
- Oasis montaj无法计算均衡重力异常
- Unity 自定义Image形状
- RatingBar详解
热门文章
- Hadoop集群简介
- getopt_long长执行选项实例
- alibaixiu案例(含图片资源)
- Unable to make field private final java.lang.String java.io.File.path accessible: module java.base d
- Redis主从理论概述
- responsive web design plugin collection
- 商迪3D展馆设计带你云游VR互联网展厅
- [论文解读]关于机器学习测试,看这一篇论文就够了 Machine Learning Testing: Survey ,Landscapes and Horizons
- ipv6地址格式c语言,IPv6地址格式详解:ipv6地址格式怎么写?
- c语言中的inf和nan