UiScrollview scrollviewDidScroll 检测用户触摸的滚动视图

16
我在我的应用程序中使用了一个 UIScrollView,并使用 scrollviewDidScroll 方法来移动一些不在滚动视图内的其他视图。这种行为只应在用户实际使用手指移动滚动视图时发生,而不是触摸事件结束时发生。
目前我正在使用滚动视图的 dragging 属性来获得这种行为,但它存在一个问题:当用户在滚动视图上滑动并在它停止减速之前再次触摸它时,dragging 属性不为真,尽管用户正在用手指拖动滚动视图。

scrollViewDidScroll 方法中,查看你的 tableView 的 UIGestureRecognizerState,例如 yourTableView.panGestureRecognizer.state。它会告诉你用户触摸的具体状态。 - n00bProgrammer
1
Done. With sample code - n00bProgrammer
3个回答

41

UIScrollView有一个panGestureRecogniser属性,可以跟踪滚动视图中的平移手势。您可以在scrollViewDidScroll中跟踪平移手势的state,以确切地了解平移的状态。

Swift 4.0

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.isEqual(yourScrollView) {
        switch scrollView.panGestureRecognizer.state {
            case .began:
                // User began dragging
                print("began")
            case .changed:
                // User is currently dragging the scroll view
                print("changed")
            case .possible:
                // The scroll view scrolling but the user is no longer touching the scrollview (table is decelerating)
                print("possible")
            default:
                break
        }
    }
}

Objective-C

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if ([scrollView isEqual:yourScrollView]) {

        switch (scrollView.panGestureRecognizer.state) {

            case UIGestureRecognizerStateBegan:

                // User began dragging
                break;

            case UIGestureRecognizerStateChanged:

                // User is currently dragging the scroll view
                break;

            case UIGestureRecognizerStatePossible:

                // The scroll view scrolling but the user is no longer touching the scrollview (table is decelerating)
                break;

            default:
                break;
        }
    }
}

5

我认为更好的答案是使用UIScrollViewDelegate,它有以下通知:

// called on start of dragging (may require some time and or distance to move)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// called on finger up if the user dragged. velocity is in points/millisecond. targetContentOffset may be changed to adjust where the scroll view comes to rest
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);
// called on finger up if the user dragged. decelerate is true if it will continue moving afterwards
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

你还需要监听 scrollViewDidScrollToTop - kelin
@kelin 这与用户触摸有什么关系? - Marek R
当用户双击状态栏时,将调用此事件。这会导致表视图滚动到顶部。请在UIScrollViewDelegate文档中了解更多信息。 - kelin
这与问题有什么关系? - Marek R

1
var lastVelocityYSign = 0

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let currentVelocityY =  scrollView.panGestureRecognizer.velocity(in: scrollView.superview).y
    let currentVelocityYSign = Int(currentVelocityY).signum()
    if currentVelocityYSign != lastVelocityYSign &&
        currentVelocityYSign != 0 {
        lastVelocityYSign = currentVelocityYSign
    }
    if lastVelocityYSign < 0 {
        print("SCROLLING DOWN")
    } else if lastVelocityYSign > 0 {
        print("SCOLLING UP")
    }
}

Mos6y的回答: https://medium.com/@Mos6yCanSwift/swift-ios-determine-scroll-direction-d48a2327a004 (原文链接)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接