web-dev-qa-db-ja.com

iOSでscrollViewの水平スクロールをロックする方法

scrollViewがあります。一方向(垂直)にのみスクロールするようにします。水平スクロールをロックする方法はありますか?...? ...

25
A for Alpha

と同じ(適応)答え

IScrollViewでの垂直スクロールの無効化

右、ここでのすべての答えは大丈夫です...

何らかの奇妙な理由でcontentSizeを両方の次元でUIScrollViewより大きくする必要がある場合、UIScrollViewプロトコルメソッド-(void)scrollViewDidScroll:(UIScrollView *)aScrollViewを実装する水平スクロールを無効にできます。

これをUIViewControllerに追加するだけです

float oldX; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(oldX, aScrollView.contentOffset.y)];
    // or if you are sure you wanna it always on left:
    // [aScrollView setContentOffset: CGPointMake(0, aScrollView.contentOffset.y)];
}

これは、ユーザーがUIScrollViewをスクロールしたときに呼び出されるメソッドであり、そうすることで、そのコンテンツに常に同じ.xを持たせることができます。

26
meronix
self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items);

役立つはずです。同様の手法を使用して、スクロールビューを水平にロックしました。

13
Sean S Lee

スクロールビューの移動を制限することがわかった最も安全で最も成功した方法は、サブクラスUIScrollViewとオーバーライドsetContentOffset:animated:およびsetContentOffset:メソッド(以下のコード)。

これらのメソッドをオーバーライドする利点は、UIKitコードがアクションを開始する前に要求されたcontentOffsetを直接変更し、副作用を回避することです。 scrollViewDidScroll:または他のUIScrollViewDelegateメソッドでcontentOffsetを変更すると発生する可能性があります。

新しいサブクラスを作成するのにほんの数分かかり、それは魅力のように機能します。

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
    // restrict movement to vertical only
    CGPoint newOffset = CGPointMake(0, contentOffset.y);
    [super setContentOffset:newOffset animated:animated];
}

- (void)setContentOffset:(CGPoint)contentOffset {
    // restrict movement to vertical only
    CGPoint newOffset = CGPointMake(0, contentOffset.y);
    [super setContentOffset:newOffset];    
}
10
Mike Hay

これを試すことができます、

self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450);

ここで1450は私のビューの高さです。

2
Sharme

this の質問を参照してください。スクロール可能なサイズをビューの対応するサイズに設定して、スクロールするものがないようにする必要があります。

2
Tomas Vana

UIScrollViewのcontentSizeプロパティがUIScrollViewの実際の幅と同じ場合、水平スクロールはできません。

水平スクロールが有効な場合に水平スクロールを停止しますか? (つまり、contentSizeは実際のUIScrollViewの幅よりも広いですか?)「はい」の場合、なぜそれをしたいのですか?

2
occulus

ScrollViewフレームよりもcontentSizeの幅を大きく設定した場合、scrollViewは水平方向にのみスクロール可能です。 contentSizeの幅をscrollviewと同じに設定すると、スクロールしません。例えば

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,100,100)] [scrollView setContentSize:CGSizeMake(100, 300)]

1
user655152

ああiOS7がこれを使用するため(initWithNibNameで):

self.automaticallyAdjustsScrollViewInsets = NO;

3ページのページスクローラーを作成します

self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
1
Mirko Brunner

私の場合、contentSizeはxおよびyのUIScrollViewよりも大きかったです。私にとって、メロニクスの答えは非常にうまくいきましたが、私のニーズのためには完全ではありませんでした。残念ながら、水平スクロールバーはまだ表示されていました。

これは、次のコードで変更できます

- (void)webViewDidFinishLoad:(UIWebView *)webView

[self.webView.scrollView setShowsHorizontalScrollIndicator:NO];
0
BCI

スイフト

contentOffset.x = 0水平スクロールを無効にする

   extension ViewController: UIScrollViewDelegate {
          func scrollViewDidScroll(_ scrollView: UIScrollView) {
            scrollView.contentOffset.x = 0//to lock horizontal scrolling
            //scrollView.contentOffset.y = 0//to lock vertical scrolling
        }
    }

さらに、スクロールインジケータを無効にすることができます

  scrollView.showsHorizontalScrollIndicator = false//to disable HorizontalScrollIndicator
    scrollView.showsVerticalScrollIndicator = false//to disable VerticalScrollIndicator
0
Jack