关于这个嵌套滑动问题,目前网上大部分的方法都是自己写手势监听,实现起来太过繁琐,最近遇到了同样的问题,写了一个比较简单的方法
原理
内部的TableView可以滚动,外部的ScrollView也可以滚动,所以才会有滚动冲突。如果内部TableView的高度就等于自身高度,就只有外部一个ScrollView滚动了。
那么这个高度如何获取呢
首先,自己手动计算 直接pass,太麻烦,还容易出bug
ScrollView有一个属性叫做ContentSize,TableView作为ScrollView的子类自然也是有的,那么这个ContentSize.height就是tableView内部视图的高度了,但是如何确保这个值获取的时机准确呢
因为我项目tableView的数据是在接口请求后才能获取到,而tableView的reloadData方法是异步方法,所以直接写在reloadData后面是不行的,只会获取到0
于是我简单的重写了一下TableView 添加了一个回调闭包,这个闭包会在视图加载完成之后调用,这个时候的ContentSize可以保证是最新数值。
classMyTableView:UITableView{var reloadCompletion:(()->Void)?overridefunclayoutSubviews(){super.layoutSubviews()
reloadCompletion?()}}
需要注意滚动过程中这个回调会执行多次,contentSize会逐渐增大,但是最终会达到最大值(实际内部尺寸)
myTableView.reloadCompletion ={[weakself]inlet size =self?.myTableView.contentSize
self?.myTableView.snp.updateConstraints { make in
make.height.equalTo(size?.height ??0)}}
然后运行后发现tableView的高度已经是内部视图的高度了。因为高度相等,所以本身不可滑动,会随着外部的ScrollView一起滑动。
版权归原作者 小树羽 所有, 如有侵权,请联系我们删除。