UIScrollView横向排了5个UITableView,UITableView的Cell中有UISlider。在左右滑动slider的时候,如果快速滑动slider不会动,scrollview会左右滑动。
解决这个问题方法:
继承UIScrollView:
class SliderTouchScrollView: UIScrollView {
init() {
super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
NotificationCenter.default.addObserver(self, selector: #selector(sliderTouchUp), name: NSNotification.Name(rawValue: "sliderTouchUp"), object: nil)
delaysContentTouches = false
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
deinit {
NotificationCenter.default.removeObserver(self)
}
override func touchesShouldBegin(_ touches: Set<UITouch>, with event: UIEvent?, in view: UIView) -> Bool {
if view.isKind(of: UISlider.self) {
isScrollEnabled = false
}
return true
}
func sliderTouchUp() {
isScrollEnabled = true
}
}重写了touchesShouldBegin,滑动UIScrollView上的任何元素这个函数会立刻向UIScrollView报告,所以在这个时候判断如果是UISlider就把Scroll禁止掉。
init中注册了一个通知,用来监听在slider放开的时候让Scroll可以重新滚动,这个消息由slider的两个点击释放函数发送:
@IBAction func SliderTouchUpInside(_ sender: Any) {
sliding = false
startTimer()
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "sliderTouchUp"), object: nil)
}
@IBAction func SliderTouchUpOutside(_ sender: Any) {
sliding = false
startTimer()
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "sliderTouchUp"), object: nil)
}这样把UIScroll改成SliderTouchScrollView,然后在slider的上面两个事件中添加发送通知就可以有效的排除UIScrollView在拖动UISlider时滑动的问题。
博客内容讲述了在UIScrollView中包含横向排列的5个UITableView,每个单元格内含有UISlider。当快速滑动UISlider时,UIScrollView会误识别为滑动事件。为了解决这一问题,作者提出了一种解决方案:自定义UIScrollView子类SliderTouchScrollView,在初始化时注册监听slider松开的通知。当UISlider的滑动结束时,发送通知使ScrollView能够重新响应滚动,从而避免了两者交互时的冲突。
1165

被折叠的 条评论
为什么被折叠?



