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


92

私が持っているUIViewiPhoneのスプリングボードのように。私が使ってそれを作成しているUIScrollViewUIButtons。スクロールビューの水平スクロールを無効にしたいのですが。縦方向のスクロールのみが必要です。どうすればこれを達成できますか?


5
タイトルを変更する必要があります。質問では横向き、タイトルでは縦向きを求めます。人々は後で検索エンジンであなたの質問を見つけるので、それは2年後でもなお重要です:)
Julien

@RahulVyas上の男はポイントを持っています。タイトルを変更すると、検索エンジン(私など)を介してここにアクセスする初心者の混乱を減らすことができます。
SpacyRicochet 2011

ポスターの代わりにタイトルを編集した。(編集が表示される前に、現在ピアレビューを待っています。)
Duncan Babbage '28

回答:


125

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

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

UIScrollViewそれはすでに水平にすべてを表示することができますので、その後にのみ、垂直方向にスクロールします。


6
こんにちは。このソリューションは本当にうまくいきます!それをありがとう。静的な幅を0に設定してみました。私にとってもこれは機能します。後で何らかの副作用があるかどうかはわかりません。しかし、サイズがわからない場合(つまり、iPhoneおよびiPadのユニバーサルコード)、これはうまく機能します。
JackPearse

5
CGSizeMake(0、myScrollableHeight)を実行する方が良いと思うので、すべてのサブビューが表示されていなくても、水平スクロールは無効になっています。
LightNight 2013

注:ページングを使用するときにディメンションの1つを0に設定すると、正しい値に関係なく、VoiceOverがページ番号を「ページ
1/1

1
幅をハードコードされた320として渡す代わりに、次のように渡すことができます。CGSize scrollableSize = CGSizeMake(self.scrollview.frame.size.width、myScrollableHeight); [myScrollView setContentSize:scrollableSize];
Mohit kumar 2016

90

更新:(@EranMaromがコメントで指摘した後)

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

水平スクロールを停止します。

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

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

垂直スクロールを停止します。

垂直方向にスクロールする場合は、contentOffset.yを増やす必要があります。これを防ぐと、垂直方向のスクロールビューのスクロールが停止します。

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

上記のコードの変化防止xyのをscrollview contentOffset、それがでスクロールを停止につながるscrollViewDidScroll:方法。


1
この回答は、あなたがコードを与えたばかりの自分自身を説明していないので、私はダウン投票を検討しています。そのような答えはあまり良くありません。良い答えは自分で説明しますが、経験豊富な開発者はこの新しい開発者がここで何が起こっているのか理解していないかもしれないことを理解しているかもしれません。改善の機会を与えるため、まだ反対投票されていません。
ポパイ2013年

13
これは一種のハックですが、他のすべてが失敗したときに機能しました。+1ですが、最後の手段としてのみ使用してください。
i_am_jorf 14

5
このデリゲートメソッドも使用しますが、本文を1行で置き換えscrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);ます。たとえば、水平スクロールを無効にします。私はそれがより読みやすく、小さく、ゼロをテストする意味がありません。これを頻繁に実行しないコード(つまり、毎秒最大数十回)を実行するコードには実質的にオーバーヘッドがないからです。
エシェロン2014

あなたがいないような「willscroll」の前に「didscroll」の後contentOffsetを、変更しているが、これはハンマーソリューションですが、私自身は、downvoteので、18 upvotesしなかったし、それがdownvoteに値するではないので、答えは、75であるので
LolaRun 14

2
さらに簡単に、デリゲート関数で、scrollView.contentOffset.y = 0.0垂直スクロールscrollView.contentOffset.x = 0.0を停止し、水平スクロールを停止するために使用しscrollViewDidScroll()ます。ただし、とscrollView.contentSize等しいことを確認scrollView.frame.sizeする方がより良い(正しい)ソリューションであると私は信じています。@danbeaulieuの回答を参照してください。
emem 16

11

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];

これがscrollviewのスクロール動作を無効にすることはないと思います。それは...ですか??
Dinesh Raja 14

self.collectionView.pagingEnabled = YES;スムーズなスクロール(ドラッグではない)の問題を解決するのに役立ちました。問題はメソッドscrollViewWillEndDragging:にありました-targetContentOffsetはscrollView.contentOffsetと同じであり、ページ検出ロジックは正しく機能しません。
sig

11

Swiftソリューション

ビュー用とスクロールビュー用の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コンテンツサイズが設定されました。これにより、scrollviewが水平方向にスクロールしなくなります。


その他の考え:

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

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

高さまたは幅(ユニバーサルデバイス)がわからない場合はどうなりますか?@danbeaulieu
Lukesivi

@lukesIvi "myView.frame.width"は "myView" IBOutletから動的に幅を取得しています。
Dan Beaulieu、2016

4

私の場合、Swift 4.2 では以下を使用できます。

垂直スクロールを無効にする:

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

水平スクロールを無効にする:

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

3

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


3

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

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


@Nostradamus、喜んでお手伝いします
Gulfam Khan

0

(以下のように)viewDidLoadでtableview contentInsetを設定して、水平スクロールが発生する原因

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

さまざまな理由でテーブルビューcontentInsetが設定されているかどうかを確認し、無効にします


0

私はしばらくの間、このスレッドや他のスレッドでのさまざまな提案に失敗して、うまくいかなかった。

ただし、別のスレッド(どこかわからない)では、UIScrollViewで負の制約を使用するとうまくいくと誰かが提案しました。

そのため、制約のさまざまな組み合わせを試しましたが、結果に一貫性がありませんでした。最終的に私のために働いたのは、スクロールビューに-32の先行制約と後続制約を追加し、幅320(中央揃え)の(非表示の)テキストビューを追加することでした。


0

これを試して:

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

0

contentOffsetサブクラスのプロパティをオーバーライドして、水平スクロールを無効にします。

override var contentOffset: CGPoint {
  get {
    return super.contentOffset
  }
  set {
    super.contentOffset = CGPoint(x: 0, y: newValue.y)
  }
}

0

iOS 11で導入されたのは、 UIScrollView

var contentLayoutGuide: UILayoutGuide

ドキュメントには、次のように記載されています。

スクロールビューのコンテンツ領域に関連する自動レイアウト制約を作成する場合は、このレイアウトガイドを使用してください。

あなたが制約することになるでしょう追加されるかもしれないことを他の自動レイアウトの制約と一緒にwidthAnchorUIScrollViewさんをcontentLayoutGuide『フレーム』と同じサイズです。frameLayoutGuide(iOS 11でも導入されました)または任意の外部幅(など)を使用できますsuperView

例:

NSLayoutConstraint.activate([
  scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])

ドキュメント:https : //developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide


-1

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


1
申し訳ありませんが、これは質問の答えにはなりません。
David

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.