UIScrollViewがスクロールしない


128

UIScrollView多くUIImageViewの、UILabelsなどを含むを持っています...ラベルはをはるかに超えてUIScrollViewいますが、アプリを実行すると、クリックして下にスクロールできません...

これはなぜでしょうか?

ありがとう


新しい2013年3月26日私は(contentSize設定)、コードなしでこれを行うための簡単な方法につまずいstackoverflow.com/a/15649607/1705353
ディッキー・シン

回答:


169

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

// 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.0

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メソッド内です。


12
myScrollView.delegate = selfALSO を設定することを忘れないでください。これがまだ機能しない場合は、この下の答えに素晴らしいアドバイスがあります(xib / StoryBoardに移動して、「AutoLayout」が無効になっていることを確認してください)。プロのヒント:<UIScrollViewDelegate>UIScrollViewをプログラムでスクロールするなどの操作を行う場合は、.hファイルに含めることもできます。
Albert Renshaw

1
@AlbertRenshawあなたが答えを追加するべきだったので、私はあなたに+1を与えることができたでしょう:) AutoLayoutは私に問題がありました...私を4時間ぐらい狂気にさせました。
ロジロジスト、2014年

2
コードを入れるviewDidLayoutSubviewsとうまくいきます。
Amr Lotfy、2018

私にとっての問題は、すべてが画面に収まるため、スクロールする必要がないことでした。
ダニエルスプリンガー

122

contentSizeを正しく設定してもビューをスクロールできない場合は、Interface Builder-> File Inspectorで[Use AutoLayout] をオフにしてください。


164
または、viewDidLayoutSubviews:contentSizeを設定できます。これは、自動レイアウトの完了後に適用されます。
Chris Vasselli、2012年

2
@ "Chris Vasselli" slove my issue .. GR8 .. :-)
Ayaz

3
クリスのコメントは別の答えでなければなりません!
忍者

1
クリス・ヴァセリ、ありがとうございました!自動レイアウトを有効にすると、viewDidLoadでは機能しませんが、viewDidLayoutSubviewsでは機能します。
ロメイン

1
うわー、私はこれまでこれらすべてのコメントに気づかなかった!たくさんの皆さんのお役に立てて嬉しいです!私は別の回答を投稿したばかりなので、うまくいけば見つけやすくなります。
Chris Vasselli 2014年

68

設定する必要があります 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
    );
}

おかげでトン..私はの値に設定しても、何らかの理由で、これは働いていたcontentSizeの大きさにしcontentView、scrollViewとcontentViewの大きさが同じに設定しますように思われます。しかしcontentSize、の高さをの高さよりも大きい値に設定するとcontentView、機能しました。
Skywalker

viewDidLayoutSubviewsライフサイクル中に複数回呼び出される可能性があるため、高さが予想よりも高くなるリスクがあります。
anon_nerd

@anon_nerdは、すでに呼び出されているかどうかを確認し、そうでない場合にのみ高さを追加します
Daniel Springer

45

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

インターフェイスビルダーを使用している場合、これを行うための適切な方法は、ユーザー定義のランタイム属性を使用することです。例えば:

ここに画像の説明を入力してください


これは私には何もしませんでした。
coolcool1994 2013

4
おっと、写真には{0、0}と表示されていますが、もちろん十分な数を入力する必要があります。。このアプローチは、コンテンツサイズが事前にわかっている単純なビューでのみ機能します。。。(実際、複雑なビューの場合、とにかく純粋なコードをお勧めします)。
Jasper Blues

プログラムで行うよりもはるかにハックが少ないです。ありがとうございました!
Jake Stoeffler、2014年

1
@JakeStoefflerようこそ!:) IBを使用するとき、私はそこにすべての構成を保持したい(断片化されていない)。しかし、物事が複雑になると(再利用可能なビューウィジェット、モデルアダプター、レイヤー操作、CAAnimationsなど)、完全にプログラム化されたビューを使用することを好みます。。。より流暢。
Jasper Blues

私はこれを試してみましたが、ビューが表示されたときに機能しますが、向きを変更すると、上の画面で定義されたcontentSizeが無視され、私のログにcontentSizeが0,0に戻されます。それを修正する方法はありますか?
Shoogle 2014年

40

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

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

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

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


2
天才-何が起こっているかを確認するためのそのような単純な方法。本当にありがとう!
クレイジーチンパンジー

13

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


1
これをプログラムで行う必要がありますか?または私はIBでそれを行うことができますか?
マーク

IBを使用している場合は、そこから設定できます。以下を参照してください。。(別の回答なので、写真を含めることができます)。
ジャスパーブルース


5

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


同じ問題があります。私にとっての問題は、delaysContentTouchesをtrueにすると、リンゴの鉛筆を使用した低品質の描画で終了することです。しかし、これはエッジケースです:)ほとんどの場合、問題を解決します
RomOne

4

セットcontentSizeのプロパティUIScrollviewViewDidLayoutSubviews方法。このようなもの

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

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

3

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

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

ようこそ :)


3

小さな追加が1つありますが、上記はすべて、スクロールビューがスクロールしない実際の理由ですが、場合によっては、これがIBではなくコードによってスクロールビューが追加された場合に特別な理由になることがあります。サブビューを親ビューに追加し、これにより、サブビューがスクロールしなくなります。

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


3

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

数時間後..これは私のためにそれを修正したものです。私は次のレイアウトを持っていました:

UIView

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

それはすべて制約の中にあります。安全領域はシステムによって自動的に定義されます。最悪の場合には、スクロールやコンテンツビューのすべての制約を削除してくださいません IBはあなたのためにそれらを作成/リセットがあります。手動で作成してください。

  • スクロールビューの場合、私は次のようにしました。安全な領域に等しい幅/高さ
  • コンテンツビューの場合:トレーリング/リーディング/トップ/ボトムをスーパービューに合わせる(スクロールビュー)

基本的には、コンテンツビューをScrollviewに適合させることです。これは、セーフエリアに適合します。

しかし、それ自体は機能しませんでした。コンテンツビューの高さがありません。私はできる限りのことを試みましたが、トリックを行う唯一の方法は、コンテンツビューの高さを作成して、コントロールをドラッグするコンテンツビューをそれ自体にしたことです。これは、ビューコントローラのサイズから計算された固定の高さを定義し(実際のディスプレイよりも長い、フリーフォームとして定義され、すべてのサブビューを含む)、最後に再び機能しました!


いいえ、どいたしまして!私はあなたがどのように感じたかを正確に知っています。;-)
ミケーレ・ダルアガタ

Thaaaaks、私は多くの時間を費やし、これは私の問題を解決しました
Andoni Da Silva

3

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

override func viewDidAppear(animated: Bool)

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


2

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

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

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

2

チュートリアルが、どのような多くの初心者はscrollViewがされていることであるかわからない続いている場合は、時間の多くのコードは正しいです、NOTシミュレータによって正常にスクロールしようとします。あなたがマウスパッドを押し下げたときにのみスクロールすると仮定される同時にスクロール。多くの経験豊富な 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)
}

このコードは、上記で言ったことを実行している限り、問題なく機能します。


1

他の解決策がどれも機能しない場合は、スクロールビューが実際UIScrollViewにInterface Builderにあることを再確認してください。

この数日間のある時点で、クラスがインスペクタで言っていたとしても、UIScrollView 自発的に型が変更さUIViewUIScrollViewました。私は使用してい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->pressapp->click(X)を押して削除します

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

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


1

が何らかのタイプののscrollViewサブビューである場合は、がのフレームまたは境界内にあるcontainerViewことを確認してください。私が持っていたまだ私はscrollViewを参照可能となったが、ための範囲内にありませんでしたそれのタッチイベントを検出しません。scrollViewcontainerViewcontainerView.clipsToBounds = NOscrollViewcontainerView

例えば:

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

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


1

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

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

}

//set the height of content size as required

1

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

@interface testScrollViewController () <UIScrollViewDelegate>

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

1

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

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

安全領域やスーパービューにバインドされた上部および/または下部の制約を削除すると、scrollView内のビューが再びスクロールし、画面下部の上部に固定されませんでした。

これにより、誰かがこの特定の問題で何時間も苦労するのを防ぐことができます。


1

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

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

親がUIImageViewであることを理解するためにこれを追いかける2時間以上を無駄にしましたが、当然、これにはuserInteractionEnabled == falseがあります


0

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

autolayoutでスクロールビューを設定することには、直感的でない2つの点があります。

  1. contentviewとscrollviewの間のマージンとして設定した制約は、contentviewのサイズに影響しません。彼らは本当にマージンです。そして、それを機能させるには、contentviewのサイズを固定する必要があります。
  2. 固定サイズの秘訣は、コンテンツビューの幅をスクロールビューの親の幅と同じに設定できることです。左側のツリーで両方のビューを選択して、同じ幅の制約を追加します。

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


@PredragManojlovicどうすればこれより一般的になりますか?これは、自動レイアウトを使用して、scrollviewを適切に機能させる唯一の方法です。
H. de Jonge 2017年

0

私はこのAutoLayoutの問題でそれを見つけました...私がクラスの代わりに単にViewController使用する場合...そして私自身を追加するだけ...それが機能することを。UIViewUIScrollViewUIScrollView


0

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

scrollViewのリーディング、トレーリング、トップ、ボトムをスーパービューに設定した後。次の変更を加えて、containerViewをスクロール可能にしました。

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

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

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