UIScrollViewの水平スクロールを無効にするにはどうすればよいですか?
-
21-08-2019 - |
質問
私は持っています UIView
iPhoneの踏み台のようなもの。を使用して作成しました UIScrollView
そして UIButtons
. 。上記のスクロールビューで水平スクロールを無効にしたいと考えています。縦スクロールだけしたい。これを実現するにはどうすればよいですか?
解決
あなたはcontentSize
のUIScrollView
プロパティを設定する必要があります。あなたのUIScrollView
は(スクリーンの幅)幅320個のピクセルである場合たとえば、あなたはこれを行うことができます:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
それはすでに水平にすべてを表示することができますので、UIScrollView
は、その後のみ、垂直方向にスクロールされます。
他のヒント
更新しました: (@EranMarom のコメント指摘を受けて)
あなたはできる 水平スクロールまたは垂直スクロールを停止します の中に ScrollViewDelegate
方法。その方法は次のとおりです。
水平スクロールを停止します:
水平にスクロールしたい場合は、contentOffset.x を大きくする必要があります。これを防ぐと、スクロールビューの水平方向のスクロールが停止します。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
垂直スクロールを停止します:
垂直にスクロールしたい場合は、contentOffset.y を大きくする必要があります。これを防ぐと、スクロールビューの垂直方向のスクロールが停止します。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
上記のコードは、次の変更を防ぎます。 x
そして y
の scrollview contentOffset
そしてそれはスクロールを停止することにつながります scrollViewDidScroll:
方法。
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];
迅速な解決策
2 つのアウトレットを作成します。1 つはビュー用、もう 1 つはスクロール ビュー用です。
@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)
これで、Attributes Inspector
のチェックを外してのUser Interaction Enabled
の下で、ビューを選択することができます。
私の場合はcontentViewの幅はUIScrollViewのの幅よりも大きかった、それが不要な横スクロールの理由でした。私はUIScrollViewの幅に等しいcontentViewの幅を設定することにより、それを解決します。
は、それが誰か
お役に立てば幸いです私の場合は、とのスウィフトの4.2あなたが使用することができます:
垂直スクロールを無効にします:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
水平スクロールを無効にします:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
は、それがうまく働いています。
私は何
水平方向のスクロールを引き起こすこと(下記のような)のviewDidLoadに設定されたテーブルビューのcontentInsetを有していましたself.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
contentInsetは、様々な理由のために設定された任意のテーブルビューがあるかどうかをチェックして、それを無効にする
私は失敗し、この中に様々な提案や他のスレッドをしようといくつかの時間のためにこれに苦労します。
しかし、別のスレッド(わからない)に誰かがUIScrollViewの上の負の制約を使用すると、彼のために働いていたことを示唆しています。
だから私は一貫性のない結果と制約の様々な組み合わせを試してみました。どのような最終的には私のために働いたことはscrollviewに-32の先頭と末尾の制約を追加して(見えない)320の幅のTextView(および中心)を追加しました。
このお試しくださいます:
CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
この一行を使用します。
self.automaticallyAdjustsScrollViewInsets = NO;