iOS 办理UIScrollView嵌套UITableView问题(避免滑动冲突)

打印 上一主题 下一主题

主题 798|帖子 798|积分 2394

关于这个嵌套滑动问题,目前网上大部分的方法都是自己写手势监听,实现起来太过繁琐,近来遇到了同样的问题,写了一个比较简朴的方法
原理

内部的TableView可以滚动,外部的ScrollView也可以滚动,所以才会有滚动冲突。如果内部TableView的高度就即是自身高度,就只有外部一个ScrollView滚动了。
那么这个高度怎样获取呢
首先,自己手动盘算 直接pass,太贫苦,还容易出bug
ScrollView有一个属性叫做ContentSize,TableView作为ScrollView的子类天然也是有的,那么这个ContentSize.height就是tableView内部视图的高度了,但是怎样确保这个值获取的时机准确呢
由于我项目tableView的数据是在接口哀求后才气获取到,而tableView的reloadData方法是异步方法,所以直接写在reloadData背面是不行的,只会获取到0
于是我简朴的重写了一下TableView 添加了一个回调闭包,这个闭包会在视图加载完成之后调用,这个时候的ContentSize可以包管是最新数值。
  1. class MyTableView: UITableView {
  2.     var reloadCompletion: (() -> Void)?
  3.    
  4.     override func layoutSubviews() {
  5.         super.layoutSubviews()
  6.         reloadCompletion?()
  7.     }
  8. }
复制代码
需要注意滚动过程中这个回调会执行多次,contentSize会渐渐增大,但是终极会到达最大值(现实内部尺寸)
  1. myTableView.reloadCompletion = { [weak self] in
  2.     let size = self?.myTableView.contentSize
  3.     self?.myTableView.snp.updateConstraints { make in
  4.         make.height.equalTo(size?.height ?? 0)
  5.     }
  6. }
复制代码
然后运行后发现tableView的高度已经是内部视图的高度了。由于高度相等,所以本身不可滑动,会随着外部的ScrollView一起滑动。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表