私が持っているUIView
iPhoneのスプリングボードのように。私が使ってそれを作成しているUIScrollView
とUIButtons
。スクロールビューの水平スクロールを無効にしたいのですが。縦方向のスクロールのみが必要です。どうすればこれを達成できますか?
私が持っているUIView
iPhoneのスプリングボードのように。私が使ってそれを作成している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を増やす必要があります。これを防ぐと、垂直方向のスクロールビューのスクロールが停止します。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
上記のコードの変化防止x
とy
のをscrollview contentOffset
、それがでスクロールを停止につながるscrollViewDidScroll:
方法。
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
ます。たとえば、水平スクロールを無効にします。私はそれがより読みやすく、小さく、ゼロをテストする意味がありません。これを頻繁に実行しないコード(つまり、毎秒最大数十回)を実行するコードには実質的にオーバーヘッドがないからです。
scrollView.contentOffset.y = 0.0
垂直スクロールscrollView.contentOffset.x = 0.0
を停止し、水平スクロールを停止するために使用しscrollViewDidScroll()
ます。ただし、とscrollView.contentSize
等しいことを確認scrollView.frame.size
する方がより良い(正しい)ソリューションであると私は信じています。@danbeaulieuの回答を参照してください。
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];
self.collectionView.pagingEnabled = YES;
スムーズなスクロール(ドラッグではない)の問題を解決するのに役立ちました。問題はメソッドscrollViewWillEndDragging:
にありました-targetContentOffsetはscrollView.contentOffsetと同じであり、ページ検出ロジックは正しく機能しません。
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)
私の場合、contentViewの幅がUIScrollViewの幅よりも大きく、それが不要な水平スクロールの原因でした。contentViewの幅をUIScrollViewの幅に等しく設定することで解決しました。
それが誰かを助けることを願って
iOS 11で導入されたのは、 UIScrollView
var contentLayoutGuide: UILayoutGuide
ドキュメントには、次のように記載されています。
スクロールビューのコンテンツ領域に関連する自動レイアウト制約を作成する場合は、このレイアウトガイドを使用してください。
あなたが制約することになるでしょう追加されるかもしれないことを他の自動レイアウトの制約と一緒にwidthAnchor
のUIScrollView
さんをcontentLayoutGuide
『フレーム』と同じサイズです。frameLayoutGuide
(iOS 11でも導入されました)または任意の外部幅(など)を使用できますsuperView
。
例:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
ドキュメント:https : //developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide