这是我参加更文应战的第4天,活动详情查看: 更文应战

UIKit 中,当一个 scrollView(或其子类)的父控件中包括 scrollView 或其子类时,也就是说嵌套 ScrollView 时,当 scrollView 滑动到顶部或许底部时,再向上/向下滑动时,scrollView 类型appear的父控件会其联动。

免除嵌套 ScrollView / TableView 联动作用

这在大多数的状况下,坚嵌套查询持了动画的连续性。可是有些状况需求阻挠这种联动,比方直播类的 App,最外层为一个 TableView 在展现正在直播的直播间,在直播间中ios最好玩的手游还会有一个音讯展现的 tableView,此刻就需求阻挠翻滚 IM 音讯时阻挠外层的 tableView 翻滚。

怎样撤消这种联动呢?

计划一:子 ScrollView 开始翻滚和连续时发送奉告(失利)

我首要想到的是监听子 scrollView 的翻滚作业,当子类开始翻滚和完毕翻滚时发送奉告,修改父 ScrollView 的 isScrollEnabled 特征,清除翻滚。代码如下:动画

func scrollViewDidScrollios是什么意思(_ scrollView: UIScrollView) {
// 发送开始翻滚奉告ioslauncher14安卓版,让父类阻挠翻滚
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let scrollToScrollStios系统op = !scrollView.isTracking &&嵌套调用amp; !scrollView.isDragging && !scro嵌套是什么意思llView.isDecelerating
if (scrollToScrollSt动画人贩子原型梅姨op) {
didEndScroll()
}
}
func scrollViewDidEndDraggin嵌套结构g(_ scrollV手势意义图解大全iew: UIScrollView, willDecelerappreciateate decelerate: Bool) {
if (!deceler嵌套查询sql句子ate) {
let scrollToScrollStop = !scrollView.isTracking && !scrollView.isDragging && !scrollView.isDeceleratinios模拟器g;
if (scrollToSioslauncher14安卓版crollStop) {
didEndScroll()
}
}
}嵌套调用
func didEndScroll() {
// 发送连续翻滚奉告,让父类开始翻滚
}

可是发现当在子 ScrollView 的可翻滚的鸿沟时,持续翻滚,并不会触发 scrollViewDidScroll方法,所以这种计划不可嵌套if函数行。

计划二:重写子 ScrollView 的 hitTest 方法

由于父控件中的每次作业都会经过 hitTest 传递到子控件,所以可以经过响应者链,获取父 scrollView 控件,修改其 isScrollEnabl动画人贩子原型梅姨ed 特征,清除联动。

override func hitTest(_ pointioslauncher14安卓版: CGapplicationPoint, with event: UIEvent?) -> UIView? {
var responder = next
// 父ios是什么意思控件为 scrollView 的控件
viOSar superScrollView: UIScrollView?
// 经过 next 响应者向上寻找父控件为 scrollView 的控件
// 当 superScroll嵌套调用View != nil 时,阐明按照条件获取到 scrollView 或其子类的父控件政策
while reiOSsponder != nil &amp嵌套调用;& superScr嵌套查询ollView == nil {
if let scrollView = responder as? UIScrollView {
superScrollView = scrollView
} else {
responder = responder?.next
}
}
let view = super.hitTest(point, with: event)
// 假设 view != nil,阐明手ios14.4.1更新了什么势操作是当时的 scrollViioslauncherew/tableView 宣告的,
// 则需求需求阻挠父控件 superScrollView 的翻滚;
// 否则相反。
if view != nil {
superScroiOSllView?.isScrollEnabled = false
} else {
superScro手势密码图画大全llView?.isScrollEnabled = true
}
return view
}

经过实验发现这种计划可行。

其他

在修改 tableView 的 isScrollEnabled 时,发现会修改 tableViiOSew 的 contentOappleffset,形成 tableView 偏移量抖手势舞怎样学基础动。这个是由于主动设置 scrollView 的内边距形嵌套函数成的,可以经过修改下面的特征封闭:

// iOS 11 曾经,appearance修改 ViewController 的特征
automaticallyAdjustsScroliOSlViewInsets = false
// iOS 11 之后,修改 ScrollView 的特征
tableView.contentappleInsetAdjustmentBehavior = .never