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
内参加活动了。
我正在使用 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
内参加活动了。