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在出现时自动滚动到底部(不闪动,无痕)相关推荐

  1. 小程序聊天对话,每次都显示最新消息(让页面自动滚动到底部)

    //页面自动滚动到底部pageScrollToBottom:function(){wx.createSelectorQuery().select('#scrollpage').boundingClie ...

  2. 【移动端聊天功能模板】Vue实现H5聊天系统,实现上下固定中间滚动布局,微信授权功能,自动滚动到底部【详细注释,一看就会】

    前言 最近刚好在做这方面的功能,就网上看了下,发现很多种写法,但是有些写的很乱, 我也看的很麻烦,干脆就自己写一个简单的静态版本放在这, 以后需要用到的时候可以直接拿着改改就能用. 后面我还会继续更新 ...

  3. 微信小程序 页面如何自动滚动到底部

    1.页面增加标签<scroll-view></scroll-view> 2.写函数: // 页面滚动到底部pageScrollToBottom: function() {wx. ...

  4. js监听页面或元素scroll事件,滚动到底部或顶部

    基本原理: 1.滚动到底部 元素的滚动距离 + 元素的可视距离 == 元素的滚动条总距离2.滚动到顶部 元素的滚动距离 == 0 监听页面滚动 <!DOCTYPE html> <ht ...

  5. 微信小程序聊天界面进入自动滚动到底部,翻看历史聊天记录,收到的新消息不会马上置底,如收到新消息出现 底部有更多消息字样

    重点看标红部分,其他代码只是写的上下逻辑,可忽略 wxml: <view style="position: relative;width: 100%;height: 100%;&quo ...

  6. [iOS] tableView中实现底部button出现时tableView的bottom自动向上偏移

    这是我在工程中遇到的一个需求:选择照片之后,按bottomButton进行发送. 具体场景:照片存放在tableviewcontroller中,当选择照片之后,自动弹出bottomButton,点击之 ...

  7. IM 聊天页面下拉加载更多--类似微信顺滑展示

    背景     领导在会议上说我们的 IM 聊天页面的用户体验不太好,尤其是下拉加载更多会跳动,让我优化一下.之前还确实没有注意到这一点,现场拿出手机和微信做对比,不比不知道,一比还真是发现了问题.微信 ...

  8. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案

    iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 (2)https://www.cn ...

  9. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()

    iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案-scrollIntoView() 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案- ...

最新文章

  1. html meta 跳转 白屏,vue使用keepAlive之后页面空白白屏?route和router什么区别呢?...
  2. webconfig的connectionStrings字段
  3. TensorFlow学习笔记(二十八)CNN的9大模型之AlexNet
  4. flexjava通信错误之一:Server.resource.unavailable
  5. 数学题 HDOJ——2086 简单归纳
  6. 二叉搜索树相关知识及应用操作
  7. MyBatis-Plus 学习笔记
  8. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...
  9. python精度_通过Python可以达到的最高时间精度范围是多少?
  10. atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结
  11. qq不加好友实现网页在线聊天(qq在线客服)
  12. RTU和DTU的区别是什么?
  13. mysql中怎么防止数据丢失
  14. mac被锁有pin码的解锁方法
  15. atlsd.lib 和 atls.lib冲突
  16. 成功8要素Unveiling the Secrets of success in 8 words – Richard St. John’s 4 minute TED talk
  17. JS Array数组和函数
  18. Oasis montaj无法计算均衡重力异常
  19. Unity 自定义Image形状
  20. RatingBar详解

热门文章

  1. Hadoop集群简介
  2. getopt_long长执行选项实例
  3. alibaixiu案例(含图片资源)
  4. Unable to make field private final java.lang.String java.io.File.path accessible: module java.base d
  5. Redis主从理论概述
  6. responsive web design plugin collection
  7. 商迪3D展馆设计带你云游VR互联网展厅
  8. [论文解读]关于机器学习测试,看这一篇论文就够了 Machine Learning Testing: Survey ,Landscapes and Horizons
  9. ipv6地址格式c语言,IPv6地址格式详解:ipv6地址格式怎么写?
  10. c语言中的inf和nan