IPhoneのSpringboardのようなUIView
があります。 UIScrollView
とUIButtons
を使用して作成しました。このスクロールビューで水平スクロールを無効にします。垂直スクロールのみが必要です。どうすればこれを達成できますか?
contentSize
のUIScrollView
プロパティを設定する必要があります。たとえば、UIScrollView
の幅が320ピクセル(画面の幅)の場合、次のようにできます。
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
UIScrollView
は、すべてを水平方向に表示できるため、垂直方向にのみスクロールします。
更新:(@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 contentOffset
のx
とy
の変更を防ぎ、scrollViewDidScroll:
メソッドでのスクロールを停止します。
迅速なソリューション
ビュー用とスクロールビュー用の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)
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];
ビューを選択してから、Attributes Inspector
チェックを外すUser Interaction Enabled
。
私の場合、contentViewの幅はUIScrollViewの幅よりも大きく、それが横スクロールの原因となっていました。 contentViewの幅をUIScrollViewの幅に設定することで解決しました。
それが誰かを助けることを願っています
私の場合、Swift 4.2を使用すると、次を使用できます。
垂直スクロールを無効にします。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
水平スクロールを無効にします。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
この単一行を使用します。
self.automaticallyAdjustsScrollViewInsets = NO;
ViewDidLoadでtableview contentInsetを設定しました(下図)。これが水平スクロールの原因です。
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
さまざまな理由で設定されたTableView ContentInsetがあるかどうかを確認し、それを無効にします
これを試して:
CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
UIScrollViewをセルが1つだけのUITableViewに置き換えると、うまくいきました。
私はこのスレッドや他のスレッドのさまざまな提案に失敗してしばらくの間これに苦労しました。
ただし、別のスレッドで(どこにあるかわからない)誰かがUIScrollViewで負の制約を使用することが彼にとって有効であると提案しました。
そこで、一貫性のない結果を伴う制約のさまざまな組み合わせを試しました。最終的に私のために働いたのは、スクロールビューに-32の先頭と末尾の制約を追加し、320(および中央)の幅を持つ(見えない)テキストビューを追加することでした。