web-dev-qa-db-ja.com

UIScrollViewの水平スクロールを無効にする方法は?

IPhoneのSpringboardのようなUIViewがあります。 UIScrollViewUIButtonsを使用して作成しました。このスクロールビューで水平スクロールを無効にします。垂直スクロールのみが必要です。どうすればこれを達成できますか?

83
Rahul Vyas

contentSizeUIScrollViewプロパティを設定する必要があります。たとえば、UIScrollViewの幅が320ピクセル(画面の幅)の場合、次のようにできます。

CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];

UIScrollViewは、すべてを水平方向に表示できるため、垂直方向にのみスクロールします。

120
Dave DeLong

更新:(@EranMaromがコメントについて指摘した後)

ScrollViewDelegateメソッドで水平スクロールまたは垂直スクロールを停止できます。ここに方法があります、

水平スクロールを停止:

水平方向にスクロールする場合は、contentOffset.xを増やす必要があります。 scrollviewスクロールが水平方向に停止するのを防ぎます。

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.x = 0.0
}

垂直スクロールを停止:

垂直にスクロールする場合は、contentOffset.yを増やす必要があります。垂直方向のscrollviewスクロールを停止しないようにします。

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.y = 0.0
}

上記のコードは、scrollview contentOffsetxyの変更を防ぎ、scrollViewDidScroll:メソッドでのスクロールを停止します。

86
Dinesh Raja

迅速なソリューション

ビュー用とスクロールビュー用の2つのアウトレットを作成します。

@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!

次に、viewDidLayoutSubviewsで次のコードを追加できます。

let scrollSize = CGSize(width: myView.frame.size.width, 
                        height: myView.frame.size.height)
scrollView.contentSize = scrollSize

これまでに行ったのは、ビューの高さと幅を収集し、それに合わせてscrollViewsコンテンツサイズを設定することです。これにより、スクロールビューが水平方向にスクロールしなくなります。


その他の考え:

CGSizeMakeは、CGFloatsを使用して幅と高さを取得します。 2番目のパラメーターには、UIScrollViewsの既存の高さを使用する必要がある場合があります。これは次のようになります。

let scrollSize = CGSize(width: myView.frame.size.width, 
                        height: scrollView.contentSize.height)
10
Dan Beaulieu

iOS7が使用しているため

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];
10
Mirko Brunner

ビューを選択してから、Attributes Inspectorチェックを外すUser Interaction Enabled

4
Coder221

私の場合、contentViewの幅はUIScrollViewの幅よりも大きく、それが横スクロールの原因となっていました。 contentViewの幅をUIScrollViewの幅に設定することで解決しました。

それが誰かを助けることを願っています

1
Gulfam Khan

私の場合、Swift 4.2を使用すると、次を使用できます。

垂直スクロールを無効にします。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = 0.0
}

水平スクロールを無効にします。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.x = 0.0
}
1
Rincha

この単一行を使用します。

self.automaticallyAdjustsScrollViewInsets = NO;

0
Karthickkck

ViewDidLoadでtableview contentInsetを設定しました(下図)。これが水平スクロールの原因です。

self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);

さまざまな理由で設定されたTableView ContentInsetがあるかどうかを確認し、それを無効にします

0
Naishta

これを試して:

CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
0
Torongo

UIScrollViewをセルが1つだけのUITableViewに置き換えると、うまくいきました。

私はこのスレッドや他のスレッドのさまざまな提案に失敗してしばらくの間これに苦労しました。

ただし、別のスレッドで(どこにあるかわからない)誰かがUIScrollViewで負の制約を使用することが彼にとって有効であると提案しました。

そこで、一貫性のない結果を伴う制約のさまざまな組み合わせを試しました。最終的に私のために働いたのは、スクロールビューに-32の先頭と末尾の制約を追加し、320(および中央)の幅を持つ(見えない)テキストビューを追加することでした。

0
PatriciaW