UIScrollView 作为 UIControl

UIScrollView as UIControl

我正在使用 UIScrollView 实现 UIControl。我希望在用户用手指滚动滚动视图时发送 .valueChanged 事件,否则不会。为此,我需要比较滚动发生时我计算的 currentValue,如果它与之前的值不同,我将通过 sendActionsForControlEvents API 发送一个 .valueChanged 事件。我的问题:

(a) 在所有情况下了解用户拖动滚动视图的最可靠方法是什么(滚动也可以在我的代码中使用自动 API 发生)——scrollView.isDragging 或 scrollView.isTracking,或两者兼而有之?

(b) 有什么方法可以注意到 currentValue 的变化(不存储以前的值)?我正在使用 Swift 4 执行此操作,但它似乎没有提供旧值:

 private(set) public var currentValue = Int(0) {
    willSet (newValue) {
        NSLog("Old value \(currentValue), new \(newValue)")
    }
 }

根据使用代表的评论,我认为可靠的解决方案应该类似于:

class MyClass: NSObject, UIScrollViewDelegate {

    private var isUserDragging: Bool = false

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if isUserDragging {
            // Should trigger only when scroll view visible frame changes and user is dragging
            print("User is dragging")
        }
    }

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        isUserDragging = true // Should only be called when user starts dragging
    }

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if decelerate == false {
            isUserDragging = false // Disable user dragging only if no deceleration will be performed
        }
    }

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        isUserDragging = false // When deceleration is done user is not dragging anymore
    }

}

现在您应该可以在 scrollViewDidScroll 内参加活动了。