1. ホーム
  2. iphone

[解決済み] UIScrollViewでスクロールの方向を見つける?

2022-04-23 22:53:38

質問

私は UIScrollView で、水平方向のスクロールのみが許可されており、ユーザーがどちらの方向(左、右)にスクロールしたかを知りたいです。私が行ったのは UIScrollView をオーバーライドし touchesMoved メソッドを使用します。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    float now = [touch locationInView:self].x;
    float before = [touch previousLocationInView:self].x;
    NSLog(@"%f %f", before, now);
    if (now > before){
        right = NO;
        NSLog(@"LEFT");
    }
    else{
        right = YES;
        NSLog(@"RIGHT");

    }

}

でも、このメソッドは移動しても全く呼ばれないことがあるんです。どうなんでしょう?

解決方法は?

方向を決定するのは非常に簡単ですが、ジェスチャーの間に方向が何度か変わる可能性があることに注意してください。たとえば、ページングをオンにしたスクロールビューで、ユーザーがスワイプして次のページに移動する場合、最初の方向は右向きかもしれませんが、バウンスをオンにしている場合は、まったく方向が決まらず、次に左向きになることがあります。

方向を決定するために UIScrollView scrollViewDidScroll のデリゲートです。このサンプルでは lastContentOffset これは、現在のコンテンツオフセットを以前のものと比較するために使用します。もしそれが大きければ、scrollViewは右にスクロールしていることになる。もし小さければ、scrollViewは左にスクロールしています。

// somewhere in the private class extension
@property (nonatomic, assign) CGFloat lastContentOffset;

// somewhere in the class implementation
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    ScrollDirection scrollDirection;

    if (self.lastContentOffset > scrollView.contentOffset.x) {
        scrollDirection = ScrollDirectionRight;
    } else if (self.lastContentOffset < scrollView.contentOffset.x) {
        scrollDirection = ScrollDirectionLeft;
    }

    self.lastContentOffset = scrollView.contentOffset.x;

    // do whatever you need to with scrollDirection here.    
}

方向性を定義するために、以下のenumを使っています。最初の値を ScrollDirectionNone に設定すると、変数の初期化時にその方向がデフォルトになるという利点もあります。

typedef NS_ENUM(NSInteger, ScrollDirection) {
    ScrollDirectionNone,
    ScrollDirectionRight,
    ScrollDirectionLeft,
    ScrollDirectionUp,
    ScrollDirectionDown,
    ScrollDirectionCrazy,
};