web-dev-qa-db-ja.com

UIScrollViewは一方向のスクロールを無効にしますか?

私はこれに対する答えを見つけることができませんでした(たぶん誰かが解決策を一緒にハッキングした可能性があります)。

UIScrollViewでのスクロールを一方向に無効にすることは可能ですか?私は垂直または水平スクロールを無効にすることについて話しているのではなく、一方向のみについて話している。たとえば、UIScrollViewでは、スクロールビューを下方向にドラッグできるようにしたいが、上方向にはドラッグできないようにしたい

ありがとう

26
runmad

シンプルなソリューションが実際に可能で簡単であることがわかりました:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y > 60) {
        [scrollView setContentOffset:CGPointMake(0, 60)];
    }
}
34
runmad

これは私にとってはうまくいきます:

    -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
        scrollView.bounces = YES;
    }

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

        if (scrollView.contentOffset.y < 0) {
            [scrollView setContentOffset:CGPointMake(0, 0)];
            scrollView.bounces = NO;
        }

        if (scrollView.contentOffset.y == 0){
            scrollView.bounces = YES;
        }

        else scrollView.bounces = YES;
    }
8
cohen72

さいわい、scrollRectToVisibleを使用して、スクロールが制限された後の不安定な動作を回避できます。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y > 60) {
        [scrollView setContentOffset:CGPointMake(0, 60)];

        CGFloat pageWidth  = scrollView.frame.size.width;
        CGFloat pageHeight = scrollView.frame.size.height;
        CGRect rect = CGRectMake(0, 0, pageWidth, pageHeight);
        [scrollView scrollRectToVisible:rect animated:YES];
    }
}
5
yzucker

上記のソリューションでは、ユーザーが誤って垂直方向にスクロールした場合、ゼロにリセットされます。これを試して...

- (void)scrollViewDidScroll:(UIScrollView *) scrollView {
    if (scrollView.contentOffset.y > 0) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, 0)];
    }
}
3
Jim True

スクロールのコンテンツサイズをコンテンツのサイズと同じに設定すると、いずれかの方向で、スクロールするものがないため、その方向にスクロールが消えます。

1
giuseppe

UIScrollViewDelegateを使用して既に間違ったcontentOffsetを修正する代わりに(動作がおかしくなる)、代わりにUIScrollViewをサブクラス化してsetContentOffsetをオーバーライドすることを検討してください:

- (void)setContentOffset:(CGPoint)contentOffset {
    if (contentOffset.y <= 60) {
        [super setContentOffset:contentOffset];
    }
}

もちろん、これは、コンテンツオフセットに許可される最小値または最大値のプロパティを追加することで一般化できます。 setContentOffset:animated:もオーバーライドする必要がある場合があります。

0

ScrollView.contentSizeの高さをscrollView.frame.size.heightと同じ値に設定することで、垂直方向のスクロールを削除できます。オーバーフローしたコンテンツは非表示になります。もちろん、垂直スクロールを制限するために同じことを行うことができます。

0
Thyselius

これは私のために働く

static CGPoint lastOffset;

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    scrollView.scrollEnabled = YES;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    scrollView.scrollEnabled = YES;
    lastOffset = scrollView.contentOffset;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint nowOffset = scrollView.contentOffset;
    NSLog(@"delta %f", lastOffset.x - nowOffset.x);
    if ((lastOffset.x - nowOffset.x) < 0) {
        //uncomment to prevent scroll to left
        //scrollView.scrollEnabled = NO;
    } else if ((lastOffset.x - nowOffset.x) > 0) {
        //uncomment to prevent scroll to right
        //scrollView.scrollEnabled = NO;
    } else {
        scrollView.scrollEnabled = YES;
    }
}
0
ziggear

代替案は次のとおりです。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y < 10) {
        scrollView.bounces = NO;
    }

    else scrollView.bounces = YES;
}

ただし、これは、フレームよりもコンテンツが大きいscrollViewに対してのみ機能することを覚えておいてください。

0