UIScrollView上的UISlider

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, 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时滑动的问题。

你可能感兴趣的:(iOS)