web-dev-qa-db-ja.com

UIScrollViewがスクロールしない

多くのUIScrollViews、UILabelsなどを含むUIImageViewがあります...ラベルはUIScrollViewよりもはるかに長いですが、アプリを実行すると、クリックしてスクロールダウンできません...

これはなぜでしょうか?

ありがとう

124
Mark

完全に機能するコードスニペットを表示することは常に良いことです。

// in viewDidLoad (if using Autolayout check note below):

UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set

[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc

myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size

Swift 4.

let myScrollView
let contentView

// scrollview won't scroll unless content size explicitly set

myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc

myScrollView.contentSize = contentView.frame.size //sets ScrollView content size

IBでcontentSizeを設定する方法を見つけていません(Xcode 5.0以降)

注:Autolayoutを使用している場合、このコードを配置する最適な場所は-(void)viewDidLayoutSubviewsメソッド内です。

163
Bogatyr

contentSizeを正しく設定した後でもビューをスクロールできない場合、Interface Builder-> File Inspectorでncheck "Use AutoLayout"を確認してください。

119
user1539652

スクロールビューを正しくスクロールするには、スクロールビューのcontentSizeプロパティを設定する必要があります。

自動レイアウトを使用している場合は、自動レイアウトの完了後に適用されるように、contentSizeviewDidLayoutSubviewsを設定する必要があります。

コードは次のようになります。

-(void)viewDidLayoutSubviews
{
    // The scrollview needs to know the content size for it to work correctly
    self.scrollView.contentSize = CGSizeMake(
        self.scrollContent.frame.size.width,
        self.scrollContent.frame.size.height + 300
    );
}
66
Chris Vasselli

上記の答えは正しいです-スクロールを発生させるには、コンテンツサイズを設定する必要があります。

インターフェイスビルダーを使用している場合、ユーザー定義のランタイム属性を使用してこれを行うことができます。例えば:

enter image description here

45
Jasper Blues

コンテンツのサイズを膨大な数に変更してみてください。コンテンツサイズがコントロールサイズよりも大きいと思われる場合でも、スクロールビューがスクロールしない理由を理解できませんでした。コンテンツサイズが必要なサイズよりも小さい場合も機能しないことを発見しました。

self.scrollView.contentSize = CGSizeMake(2000, 2000);

2000の代わりに、あなた自身の大きな数字を置くことができます。そして、それが機能する場合、サイズ変更時にコンテンツのサイズが十分に大きくないことを意味します。

デリゲートは、スクロールビューが機能するために必要ではありません。

39
wzbozon

スクロールビューのcontentSizeプロパティが正しいサイズ(つまり、すべてのコンテンツを包含するのに十分な大きさ)に設定されていることを確認してください。

13
Ben Gottlieb

[自動レイアウトを使用する]チェックボックスをオフにすると、トリックが実行されます。

環境:xCode 5.0.2ストーリーボードios7

7
Gaurav Kumkar

私の場合、delaysContentTouchesをtrueに設定する必要がありました。これは、scrollView内のオブジェクトがすべて、scrollView自体に処理させるのではなく、タッチイベントをすべてキャプチャして処理するためです。

4
devios1

contentSizeメソッドでUIScrollviewViewDidLayoutSubviewsプロパティを設定します。このようなもの

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
4
Vinayak Parmar

viewDidLayoutSubviewsが存在しないというメッセージ(IOS8/Swift)を受け取っている場合は、代わりに次を使用してください

override func viewDidAppear(animated: Bool)

これは私のためにそれを修正しました

3
Jason G

上記のすべてが、スクロールビューがスクロールしない実際の理由ですが、スクロールビューがIBではなくコードを介して追加される場合、特に注意してください。これは、サブビューを親ビューに追加してこれにより、サブビューがスクロールしなくなります

コンテンツサイズを設定し、親ビューフレームよりも大きくしてください(duhh !!)

3
Abhinav Singh

スクロールのコンテンツサイズをスクロールビューのサイズより小さく設定したために、スクロールビューがスクロールしない理由は間違っています。スクロール中にコンテンツをナビゲートするには、スクロールビューのサイズよりも大きいコンテンツサイズを設定する必要があります。

ズームについても同じ考え方で、ズームアクションを通じて適用されるズームの最小値と最大値を設定します。

ようこそ :)

3
Abo3atef

多くの場合、チュートリアルに従っていればコードは正しいですが、多くの初心者が知らないのは、scrollViewがNOTシミュレーターを通常通りスクロールすることです。マウスパッドを同時にスクロールしたときにのみスクロールすることを想定しています。多くのExperienced XCode/Swift/Obj-Cユーザーはこれを行うのに慣れているため、初心者がどのように見落とす可能性があるかわかりません。チャオ:-)

@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(scrollView)
    // Do any additional setup after the view
}

override func viewWillLayoutSubviews(){
    super.viewWillLayoutSubviews()
    scrollView.contentSize = CGSize(width: 375, height: 800)
}

このコードは、上で言ったことをすれば完璧に機能します。

2
flo527

以前に言及されなかった何か!

コンセントがscrollViewに正しく接続されていることを確認してください!塗りつぶされた円があるはずですが、たとえ塗りつぶされた円であっても、scrollViewが接続されていない可能性があります。円にカーソルを合わせて、実際のスクロールビューが強調表示されるかどうかを確認してください! (これは私の場合でした)

//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
2
coolcool1994

私は最初の試行でそれを機能させました。自動レイアウトとすべてで、追加のコードはありません。その後、コレクションビューがバナナになり、実行時にクラッシュし、何が間違っているのかを見つけることができなかったため、削除して再作成し(Xcode 10 Beta 4を使用しています。バグのように感じました)、スクロールが消えました。ただし、コレクションビューは再び機能しました。

数時間後..これは私にとってそれを修正したものです。次のレイアウトがありました。

IView

  • 安全地帯
  • スクロールビュー
    • コンテンツビュー

すべてが制約内にあります。セーフエリアはシステムによって自動的に定義されます。最悪の場合、スクロールビューとコンテンツビューのすべての制約を削除し、not IBをリセット/作成します。それらを手動で作成してください。

  • スクロールビューの場合:トレイリング/トップをセーフエリアに揃えます。幅/高さがセーフエリアに等しくなります
  • コンテンツビューの場合:末尾/先頭/上部/下部をスーパービュー(スクロールビュー)に揃える

基本的に、コンセプトは、セーフビューに適合するScrollviewに適合するコンテンツビューを持つことです。

しかし、それ自体は機能しませんでした。コンテンツビューで高さが見つかりませんでした。私はできる限りのことを試してみましたが、トリックを行ったのはコンテンツビューの高さでコントロールビューを作成し、コンテンツビュー自体を作成するだけでした。これは、View Controllerのサイズから計算された固定高さを定義し(実際の表示よりも長いフリーフォームとして定義され、すべてのサブビューを含む)、最後に再び機能しました!

2

scrollViewが何らかのタイプのcontainerViewのサブビューである場合、scrollViewcontainerViewのフレームまたは境界内にあることを確認してください。 scrollViewを表示できるcontainerView.clipsToBounds = NOがありましたが、scrollViewcontainerViewの境界内になかったため、タッチイベントは検出されませんでした。

例えば:

containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;

ScrollViewを表示することはできますが、ユーザーの操作は受け付けません。

1
Chase Roberts

私の問題は以下によって解決されました:

  1. scrollViewのcontentSizeを大きな高さに設定する
  2. しかし、また、scrollView内のビューの上部および/または下部の制約を修正する必要がありました。つまり、スクロールインジケータは画面に表示されましたが、コンテンツはスクロールしませんでした

セーフエリアやスーパービューにバインドされた上部および/または下部の制約を削除すると、scrollView内のビューが再びスクロールする可能性があり、画面の下部の上部に固定されたままになりませんでした!

これにより、この特定の問題で他の人が何時間も苦しむことを止められることを願っています。

1
Henry Heleine

他のソリューションがどれもうまくいかない場合は、スクロールビューがInterface Builderで実際にUIScrollViewであることを再確認してください。

インスペクターでクラスがUIScrollViewと言っていたにもかかわらず、過去数日間のある時点で、私のUIView自発的に変更されたタイプからUIScrollViewになりました。 Xcode 5.1 (5B130a)を使用しています。

新しいスクロールビューを作成して、古いビューから測定値、設定、および制約をコピーするか、UIScrollViewファイル内のビューをxibに手動で変更できます。比較してみると、次の違いが見つかりました。

オリジナル:

<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>

タイプが自発的に変更した後:

<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>

そこで、<view>行を元の<scrollView>行に置き換えました。

また、ビューの終了タグ</view></scrollView>に置き換えました。

この場合、idを現在のビューと同じにしてください:id = "qRn-TP-cXd"。

また、アプリの派生データを削除して、Xcodeのキャッシュからxibをフラッシュする必要がありました。

  • Xcode->Window->Organizer->Projects、プロジェクトを選択し、[派生データ]行で[削除...]をクリックします.

または、デバイスを使用している場合:

  • Xcode->Window->Organizer->Device、デバイスの選択->アプリケーション、アプリの選択、クリック(-)

プロジェクトをクリーンにし、シミュレーター/デバイスからアプリを削除します。

  • Xcode->Product->Clean
  • iOS Simulator/device->pressを押し、app->clickを押して(X)削除します

その後、アプリをビルドして実行し、再びスクロール機能を使用できるようになります。

追伸スクロールビューのコンテンツサイズをviewDidLayoutSubviewsに設定したり、自動レイアウトをオフにする必要はありませんでしたが、YMMVです。

1
Zack Morris

viewDidLayoutSubviewsに次のコードを追加すると、Autolayoutで機能しました。すべての答えを試した後:

- (void)viewDidLayoutSubviews
{
    self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);

}

//set the height of content size as required
1
Savvy iPhone

UIScrollViewDelegateを追加し、viewDidAppearメソッドに次のコードを追加して修正しました。

@interface testScrollViewController () <UIScrollViewDelegate>

-(void)viewDidAppear:(BOOL)animated {
    self.scrollView.delegate = self;
    self.scrollView.scrollEnabled = YES;
    self.scrollView.contentSize = CGSizeMake(375, 800);
}
1
Trianna Brannon

このAutoLayoutの問題により、クラスにViewControllerの代わりにUIViewの代わりにUIScrollViewを使用するだけの場合は、UIScrollViewを追加するだけです。 ..それが動作すること。

0
Brian Rice

さらに別の楽しいケース:

scrollview.superview.userInteractionEnabledはtrueでなければなりません

親がUIImageViewであることがわかり、当然、userInteractionEnabled == false

0
Anton Tropashko

このスレッドで提供された答えで失敗した後、私は この記事 を見つけました。

自動レイアウトを使用してスクロールビューを設定することについて、直感的でない2つのことがあります。

  1. Contentviewとscrollviewの間のマージンとして設定した制約は、contentviewのサイズに影響しません。彼らは本当にマージンです。そして、それを機能させるために、コンテンツビューは固定サイズでなければなりません。
  2. 固定サイズの秘Theは、contentviewの幅をscrollviewの親の幅に等しく設定できることです。左側のツリーで両方のビューを選択し、等幅の制約を追加するだけです。

これがその記事の要旨です。イラストを含む完全な説明については、それをチェックしてください。

0
H. de Jonge

IBでも同じ問題がありました。

ScrollViewの先頭、末尾、上下をsuperViewに設定した後。 containerViewをスクロール可能にするために以下の変更を行い、機能しました。

ScrollViewを水平方向にのみスクロールするには、scrollViewのcenterY = ContainerViewのcenterYを使用して制約を作成します。

そして、垂直にスクロール可能にするには、scrollViewのcenterX = ContainerViewのcenterXを作成します

0
Nandu