关于这个嵌套滑动问题,目前网上大部分的方法都是自己写手势监听,实现起来太过繁琐,近来遇到了同样的问题,写了一个比较简朴的方法
原理
内部的TableView可以滚动,外部的ScrollView也可以滚动,所以才会有滚动冲突。如果内部TableView的高度就即是自身高度,就只有外部一个ScrollView滚动了。
那么这个高度怎样获取呢
首先,自己手动盘算 直接pass,太贫苦,还容易出bug
ScrollView有一个属性叫做ContentSize,TableView作为ScrollView的子类天然也是有的,那么这个ContentSize.height就是tableView内部视图的高度了,但是怎样确保这个值获取的时机准确呢
由于我项目tableView的数据是在接口哀求后才气获取到,而tableView的reloadData方法是异步方法,所以直接写在reloadData背面是不行的,只会获取到0
于是我简朴的重写了一下TableView 添加了一个回调闭包,这个闭包会在视图加载完成之后调用,这个时候的ContentSize可以包管是最新数值。
- class MyTableView: UITableView {
- var reloadCompletion: (() -> Void)?
-
- override func layoutSubviews() {
- super.layoutSubviews()
- reloadCompletion?()
- }
- }
复制代码 需要注意滚动过程中这个回调会执行多次,contentSize会渐渐增大,但是终极会到达最大值(现实内部尺寸)
- myTableView.reloadCompletion = { [weak self] in
- let size = self?.myTableView.contentSize
- self?.myTableView.snp.updateConstraints { make in
- make.height.equalTo(size?.height ?? 0)
- }
- }
复制代码 然后运行后发现tableView的高度已经是内部视图的高度了。由于高度相等,所以本身不可滑动,会随着外部的ScrollView一起滑动。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |