UIScrollViewスクロール可能なコンテンツサイズのあいまいさ


510

開発者の皆さん、Interface Builder(Xcode 5 / iOS 7)のAutoLayoutに問題があります。これは非常に基本的で重要なので、これが正しく機能する方法を誰もが知っておくべきだと思います。これがXcodeのバグである場合、それは重大なバグです!

したがって、このようなビュー階層があるときはいつでも問題が発生します。

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollViewには、すべての側面から50ピクセルなどの制約があります(問題ありません)。次に、UILabelにTop Space制約を追加します(問題ありません)(そして、ラベルの高さ/幅を固定することもできますが、何も変更しませんが、Labelの固有のサイズのために不要になるはずです)。

UILabelに末尾の制約を追加すると、問題が発生します。

例:末尾のスペース:スーパービュー等しい:25

ここで2つの警告が発生します-その理由がわかりません。

A)スクロール可能なコンテンツサイズのあいまいさ(スクロールビューには、スクロール可能なコンテンツの高さ/幅があいまいです)

B)ビューの配置ミス(予想ラベル:x = -67実際:x = 207)

私はこの最小限の例を、新しくダウンロードできる新しいプロジェクトで実行し、スクリーンショットを添付しました。ご覧のとおり、Interface Builderは、LabelがUIScrollViewの境界(オレンジ色の破線の長方形)の外側にあると想定しています。問題解決ツールでラベルのフレームを更新すると、ラベルがすぐに移動します。

注:UIScrollViewをUIViewに置き換えると、動作は期待どおりになります(ラベルのフレームは正しく、制約に従います)。したがって、UIScrollViewに問題があるか、何か重要なことを見逃しているようです。

IBで提案されているように、ラベルのフレームを更新せずにアプリを実行すると、正確に、正確に配置され、UIScrollViewはスクロール可能です。フレームを更新すると、ラベルが見えなくなり、UIScrollViewがスクロールしません。

オビ=ワン・ケノービを助けて!なぜあいまいなレイアウトなのですか?なぜ見当違いの表示ですか?

ここでサンプルプロジェクトをダウンロードして、何が起こっているのかを理解できるかどうか試してください:https : //github.com/Wirsing84/AutoLayoutProblem

Interface Builderの問題の図


8
UILabelをコンテンツビューに配置し、ラベルの後端をコンテンツビュー(通常のUIView)に設定してみてください。この動画は非常に役立ちます:youtube.com/watch
v

1
すばらしいビデオですが、警告は修正されませんでした。:(
ロジャース氏

ビデオをありがとうございました-(驚くべきことに)私はそれから多くのことを学びました!ただし、ビデオの知識をstackoverflow.com/questions/18953617/と組み合わせると、警告を修正できます。残る問題は、scrollViewのcontentViewのサイズを必要なだけ大きくする方法ですか?
Wirsing

このビデオを見てください。XCode 5 / iOS 7でUIScrollLayoutとautolayoutを使用する方法を示します。
jaxvy 14

私の提案はUIScrollView直接使用しないことです。代わりに、UICollectionViewまたはUITableView可能な限り使用して、ほとんどすべてのことがこれらの要素で可能であり、シンプルさ、可読性、再利用性も提供します!!!
SPatel

回答:


1093

だから私はこのように整理した:

  1. UIScrollView add aの内部UIView(これを呼び出すことができますcontentView)。

  2. このでcontentView上、下、左、右のマージンを0設定します(もちろん、scrollViewどれがであるかsuperView)。また、中心を水平および垂直に揃えるように設定します。

完成

これですべてのビューを追加できcontentViewcontentSizeのはscrollViewに従って自動的にサイズ変更されますcontentView

更新:

いくつかの特別なケースは、以下のコメントで@Sergioによって投稿されたこのビデオでカバーされています。


33
scrollviewがコンテンツの長さを推測できず、それに応じてcontentSizeをサイズ変更して内部のオブジェクトに合わせることができないことを除いて、ほぼ完璧です。contentView内にtableviewがあり、その高さが(制約によって)変更され、scrollviewでスクロールできません。
Cyber​​Mew、2015年

28
たぶん、このビデオは残りのすべての問題を克服するのに役立ちます。
セルジオ

46
これはそれをスクロールさせません。
ドリアン

2
@MatteoGobbiそれでした!それはトリックをしました!このようなscrollView autoLayoutの狂気の問題に2日間悩んでいました。
polo987

56
ScrollViewがスクロールできないという問題に直面している人にとっては、contentViewの下部を設定し、優先度を低くして中央の制約を垂直方向に揃えることで解決しました。
jimmy0251 2016年

98

このエラーを追跡するにはしばらく時間がかかりました。最初にScrollViewのサイズを固定しようとしましたが、エラーメッセージに「コンテンツサイズ」と明確に示されています。ScrollViewの上から固定したものはすべて下にも固定したことを確認しました。このようにして、ScrollViewは、すべてのオブジェクトと制約の高さを見つけることにより、コンテンツの高さを計算できます。これにより、あいまいなコンテンツの高さが解決され、幅はかなり似ています...最初はほとんどのXがScrollViewの中央に配置されていましたが、オブジェクトをScrollViewの側面に固定する必要もありました。iPhone6の方が画面が広い可能性があるので、これは好きではありませんが、「あいまいなコンテンツの幅」エラーは解消されます。


31
回答ありがとうございます!私があなたを正しく理解していれば、ScrollViewのすべてのサブビューを上下に固定することでエラーを取り除くことができます。ただし、これは必須ではありません。スクロールビューの上から下に連続した制約を作成する方法があることを確認する必要があります。[-XXX]それが理解できたことを願っています;>
Wirsing

1
ビューの高さが変動する場合、問題を修正するにはどうすればよいですか?scrollviewがサイズを計算できるように、制約を設定するにはどうすればよいですか?
2013年

2
「スクロールビューの上から下まで連続的に制約を設定する方法があることを確認する必要があります」<-その文章に感謝
Adam Waite

3
スクロールビューが上部または下部のレイアウトガイドではなくスーパービューに固定されていることを確認するのに役立ちました。下のレイアウトガイドの制約を削除し、インターフェイスビルダーの代わりにメニューを実行しました。Editor-> Pin-> Bottom Space to Superview。
アルベルトロペス

2
スクロールビューの幅を携帯電話の画面またはUI内の他の要素(含まれているUIViewなど)の幅にしたい場合は、メジャーのスクロールビューの外側にある別の要素を使用して、それに「等しい幅」を設定する必要があります。
デパルタメントB 14

89

Xcode 11以降

を使用する最も簡単な方法autolayout

  1. 追加してUIScrollView、それ0,0,0,0をスーパービュー(またはご希望のサイズ)に固定します
  2. UIViewScrollView を追加し、0,0,0,04辺すべてに固定し、中央に配置horizontallyverticallyます。
  3. サイズインスペクタでbottomalign center Y優先度を250に変更します。(水平スクロールの変更trailingalign center X
  4. 必要なすべてのビューをこのビューに追加します。一番下のビューに下部制約を設定すること忘れないでください
  5. を選択しUIScrollView、サイズインスペクタを選択して、選択を解除しContent Layout Guidesます。

1
scrollviewのコンテンツの高さを設定できませんでしたが、機能します。:)
ブラインドニンジャ

2
ヒント:私がそれを機能させたのは、中央を水平および垂直に削除し、それを同じ幅(scrollView + scrollView内のビュー)で置き換え、コンテンツに基づいて高さを追加した場合のみです。つまり、ビューの最後の要素には下部制約が必要です。詳細については、こちらをご覧ください:stackoverflow.com/a/54577278/5056173
Sean Stayns

1
ショーン、私はこれを文字通り毎日使用しており、垂直方向と水平方向のスクロールビューのスクロールに関しては、このアプローチに問題がなかった。たぶん、あなたは一番下/最後の要素に下拘束を置くのを忘れました。それがなければ、これは機能しません。
ジョルジェNilović

7
ポイント番号4-2番目の文は大きなものです。
ニティッシュ

2
この答えは完璧に機能しました
satvinder singh

63

これは、私の自己回答の質問UIScrollView + Centered View + Ambigous Scrollable Content Size +多くのiPhoneサイズの答えです。

しかし、それもあなたのケースを完全にカバーします!

したがって、最も単純なケースの初期状態は次のとおりです。

  1. すべてのエッジに0制約のあるscrollView
  2. ボタンは、水平および垂直を中心一定の幅と高さの制限
  3. そして、もちろん- 迷惑な警告 Has ambiguous scrollable content widthHas ambiguous scrollable content height

1

すべて、私たちがしなければならないのは:

  • 2つの追加の制約を追加します。たとえば、ビューの末尾および/または下部のスペースを「0」にします(下のスクリーンショットの例をご覧ください)。

重要:末尾または下部の制約を追加する必要があります。「リーディングでトップ」ではない-うまくいかない!

2

この問題を修正する方法を示すサンプルプロジェクトで確認できます。

PS

論理によると-このアクションは「矛盾する制約」を引き起こすはずです。しかし、違います!

それが機能する理由と、Xcodeがどの制約がより優先されるかを検出する方法がわかりません(これらの制約に明示的に優先順位を設定していないためです)。誰かが以下のコメントでそれがうまくいく理由を説明してくれれば私は感謝します。


すばらしいヒントです。最終的に、下端に制約を作成し、優先度を中または低に設定しました
Dean

うわー!これは真剣には意味がありませんが、機能します!ありがとうございました!私のビューにある最後のアイテムは、0の下部制約とBANGを設定しました。ついに働いた。
Jakob Hviid

60

Xcode 11 +、Swift 5

なぜすべての回答が機能しないのか疑問に思っている場合は、 、コンテンツビュー(スクロールビュー内に配置したビュー)を、フレームレイアウトガイドではなく、スクロールビューのコンテンツレイアウトガイドに固定していることを確認してください。

コンテンツビューのエッジ(リーディング、トレーリング、トップ、ボトム)は、画像のリーディングのように固定しないでください-フレームレイアウトガイド

好きじゃない

しかしこのように-コンテンツレイアウトガイドへ。

ドロップダウンからコンテンツレイアウトガイドを選択します

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

そして、ほとんどの答えはあなたのために働くでしょう。

最も単純なアプローチは次のようになります。

  1. ルートビューにスクロールビューを配置する
  2. スクロールビューのすべての側面をスーパービューに固定する
  3. 別のUIView(コンテンツビューと呼びます)を取得し、スクロールビュー内に配置します
  4. コンテンツビューのすべての側面をスクロールビューのコンテンツレイアウトガイドに固定
  5. コンテンツビューの幅をスクロールビューのフレームレイアウトガイドと同じになるように固定します
  6. コンテンツビューの高さを任意の方法で修正します(以下の例では、一定の高さ制限を使用しました)。

全体的に、最も単純な実装での構造は次のようになります。

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


@WantToKnow高さの制約を取得する必要はありません。優先度をlow(250)に変更するだけです
Reckoner

Xcode 11以降、Swift5。@ WantToKnowの回答に従って問題を解決したため、[video] [1]および[code] [2] [1]を準備しました:youtube.com/watch ?v=qMrH5_Yj5hM [2]:github.com/AhmAbdallah/CustomCollectionView
Ahmed Abdallah

1
これは素晴らしい答えです、ありがとう。
コンスタンティン

1
これが正解です。ありがとう。
Vincent Joy

これは私が、コンテンツビューの最後の要素を下の制約を追加した場合にのみ、私のために働いた
D.Zotov

49

以下で説明するようにUIView、のサブビューとしてを作成する必要がありUIScrollViewます。

  • UIViewController
  • UIView 「メインビュー」
    • UIScrollView
      • UIView 「コンテナビュー」
        • [あなたのコンテンツ]

2番目のステップは、UIScrollView制約を作成することです。私はこれを、そのsuperViewの上部、下部、先行、および後続の制約で行いました。

次に、コンテナの制約を追加しましたUIScrollView。ここで問題が始まります。同じ制約(上、下、リーディング、トレーリング)を設定すると、ストーリーボードは警告メッセージを表示します。

「スクロール可能なコンテンツの幅があいまいです」および「スクロール可能なコンテンツの高さがあいまいです」

上記と同じ制約を続行し、そしてちょうど制約を追加Equal Heightし、Equal Widthあなたにコンテナビューに関連したメインビューしないように、あなたUIScrollView。つまり、コンテナビューの制約は、UIScrollViewのスーパービューにます。

その後、ストーリーボードに警告は表示されなくなり、サブビューの制約を追加し続けることができます。


2
同意-コンテナービューを追加することは、最良で最も保守可能なソリューションだと思います。
Andrew Ebling 2014年

1
このソリューションは、管理するナビゲーションバーがない場合に機能します。
Leena、2015年

26

同じ問題がありました。このチェックボックスをオフにします。コードでコンテンツサイズを設定しているため。 ここに画像の説明を入力してください


24

ようやくこれを理解しました。これが理解しやすくなればいいのですが。

多くの場合、前述のようにベースUIViewを「コンテンツビュー」としてスクロールビューに追加することにより、この警告をバイパスし、スクロールビューと同じサイズにして、このコンテンツビューでこれらの6つのパラメーターを設定できます。

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

ご覧のとおり、合計6つのパラメータが必要です。通常の状況では、2つの制約を複製していますが、これがこのストーリーボードエラーを回避する方法です。


1
3つの異なる画面幅(4 / 5、6、6 +)が心配なので、上記はほぼうまくいきました。コンテンツビューとスクロールビューを同じ幅に設定しました。そうです、私はすでにコンテンツビューに先頭と末尾のスペースを0にするように言ったので、これは重複です。
スチュアートP.

8
定数値の代わりに、コンテンツビューからスクロールビューに同じ幅と高さの制約を設定できます。これはすべての解像度で機能します。
Kumar C

同じものを実装する必要があるので、コンテンツビューとスクロールビューの両方に同じ高さと幅を設定する必要があることを手伝っていただけますか?
ウルミ2017

まだこれを行う必要があるかどうかを確認する価値があるかもしれません。最近、scrollviewでimageViewを設定し、上部に表示されている4つの制約を設定するだけで問題を回避でき、Xcode 8.3でエラーが消えました
William T.

1
@Honeyこれは3年以上前に投稿されました。それ以来、ストーリーボードは確実に改善されています。コンテンツビューがなくても、すぐに脱出できることに気づきました。答えを調整します。
ウィリアムT.

16

私は遅れているかもしれませんが、次の解決策は、ストーリーボードを使用するだけで、追加のコードなしでこの種の問題を解決します

コンテンツビューでは、scrollviewの先頭/末尾/上/下のスペースに制約を設定する必要があります。これにより、次のようにコンテンツビューフレームは変更されませんここに画像の説明を入力してください

もちろん、スクロールビューがコンテンツサイズを認識できるように、コンテンツビューに追加の制約を作成する必要があります。たとえば、固定の高さと中心のxを設定します。

お役に立てれば。


7

私にとってcontentViewは、提案されたとおりに追加することは実際には機能しませんでした。さらに、ビューが追加されるためオーバーヘッドが発生します(ただし、これは大きな問題とは見なしていません)。私にとって最も効果的だったのは、のあいまいさチェックオフにすることだけでしたscrollView。すべてがうまくレイアウトされているので、私のような単純なケースでは問題ないと思います。ただし、scrollViewブレークに他の制約がある場合、Interface-Builderは警告を出さないことに注意してください。

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


5
これは警告を削除し、問題を解決するために何もしません。
Predrag Manojlovic 2017年

君は。あります。俺の。ヒーロー。これが存在することに気づかなかったし、それを見つけてうれしい!私はあなたが期待する「位置のみを検証する」を試しました、私は知りません、位置のみを検証しますが、このバグのある「コンテンツサイズ」の問題も許しません。「確認しない」を選択する必要があります。ありがとう!
ダスティン

プログラムで子ビューを作成している場合、これが正しい答えだと思います。ありがとう!
フロリアンクシェ


3

以下を参照してください。スクロールビューのコンテンツビューを垂直および水平に集中化します。あいまいなエラーが発生しました。コンテンツビューからscrollviewに追加された2つが必ず1)ボタンスペースからコンテナーへ2)トレーリングスペースから制約まで、スクリーンショットで強調表示されていることを確認してください。

これらの制約は、スクロールでは、コンテンツビューの高さまたは幅の後にどれだけスクロールできるかを意味します。

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

それはあなたを助けるかもしれません。


3

選択したビューに「自動レイアウトの問題を解決」>「不足している制約を追加」を使用して、ビューのこの種の問題を解決しました ここに画像の説明を入力してください

次の2つの制約で問題が解決します。

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

トレーリング、ボトムはUIScrollViewのトレーリング、ボトムです


これは、「下へ」制約を追加することで私に役立ちました。今考えてみると、それは完全に理にかなっています。
SilverWolf-Monica

3

contentView(使用したUView容器の内部など)UIScrollViewの縁に、スティックを(topbottomtrailingleading)スーパーの(UIScrollView)とcontentView有していなければならないequalwidthequalheightスーパーへ。これらは制約です。そしてメソッドの呼び出し:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

私のために解決された問題。


3

Swift 4+アプローチ:

1)UIScrollViewの上下左右のマージンを0に設定します

2)UIScrollView内にUIViewを追加し、上部、下部、先頭、末尾のマージンを0(UIScrollViewマージンに等しい)に設定します。

3)最も重要な部分は、幅と高さを設定することです。高さの制約の優先度を低くする必要があります

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

2

@Matteo Gobbiの答えは完璧ですが、私の場合、スクロールビューはスクロールできません。「中央揃えY」を削除して「高さ> = 1」を追加すると、スクロールビューがスクロール可能になります


2

uiscrollviewがスクロールしないことに苦労している人は、コンテンツビューの下部の制約を最後のビューの下部のレイアウト(コンテンツビューの内側)に設定するだけです。中央のY拘束を削除することを忘れないでください。

残りのすべての制約は、上で定義したものと同じです。Scrollviewは、コンテンツビューから最大の高さを取得することのみを考慮し、それを最後のビューの下部の制約として設定しています。つまり、ScrollViewはコンテンツのオフセットを自動的に変更します。

私の場合、最後のビューはno line of property = 0(コンテンツに応じて自動的に高さを調整)でUILableだったので、uilableの高さが動的に増加し、最終的に、uilableの下部レイアウトがコンテンツビューの下部に揃えられているため、スクロール可能な領域が増加します。これにより、scrollviewはコンテンツのオフセットを増加させます。


2

youTubeで動画を作りました
Xcodeのストーリーボードのみを使用 Scroll StackViewsで

ここには2種類のシナリオが表示されると思います。

scrollView内のビュー-

  1. 固有のコンテンツサイズはありません(例UIView
  2. 独自の固有のコンテンツサイズを持っています(例UIStackView

どちらの場合も垂直スクロール可能なビューの場合、次の制約を追加する必要があります。

  1. 上、左、下、右からの4つの制約。

  2. scrollviewと同じ幅(水平スクロールを停止するため)

固有のコンテンツの高さを持つビューには、他の制約は必要ありません。

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


固有のコンテンツの高さがないビューの場合、高さの制約を追加する必要があります。高さの制約がscrollViewの高さより大きい場合にのみ、ビューがスクロールします。

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


2
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // you can use here any of your subview

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

出力:

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


あなたがすでにleftAnchorを持っているのに、なぜleadingAnchorが必要なのですか?
ShadeToD

私たちは、同じ達成するためのleadingAnchorを使用するようにしましたのでleftAnchor ..この目的のために使用することはできません
IAJ

あなたはあなたの例で両方を使いました。
ShadeToD

@ShadeToDで確認させてください
iAj

2

私の場合、iPadではコンテンツサイズとコンテンツサイズのあいまいさの問題が発生しましたが、iPhoneの場合は機能していました。この問題を解決するために、ストーリーボードに次の変更を加えました。

  1. UIViewにスクロールビューを追加し、0、0、0、0に先行、上、後、下の制約を追加します。
  2. たとえばの要件に従って、スクロールビューの高さを設定します。100。
  3. UIViewを追加してビューをスクロールし、制約をリーディング、トップ、トレーリング、ボトムに0,0,0,0に追加し、center(X)とcenter(Y)制約を揃えます。
  4. スクロールビューのサイズインスペクターで「コンテンツレイアウトガイド」の選択を解除します。

1

縦スクロール

  1. 制約0,0,0,0のUIScrollViewをスーパービューに追加します。
  2. ScrollViewにUIViewを追加し、スーパービューに制約0、0、0、0を設定します。
  3. UIViewに同じ幅制約をUIScrollViewに追加します。
  4. 高さをUIViewに追加します。
  5. 制約付きの要素をUIViewに追加します。
  6. 一番下の要素については、UIViewの一番下に制約があることを確認してください。

0

私がしたことは、ここに示すように別のコンテンツビューを作成することです。

コンテンツビューはフリーフォームであり、contentViewに関連する独自の制約を持つすべてのサブビューを追加できます。

UIScrollViewがメインビューコントローラに追加されます。

プログラムで、IBOutletを介してクラスにリンクされているcontentViewを追加し、UIScrollViewのcontentViewを設定します。

Interface Builderを介したContentViewによるUIScrollView


0

同じエラーが発生しました。

  1. 表示(スーパービュー)
  2. ScrollView 0、0、600、600
  3. ScrollView内のUIView:0、0、600、600
  4. UIViewには画像ビュー、ラベルが含まれます

scrollView(2)に続いてUIView(3)のリーディング/トレーリング/トップ/ボトムを追加します。

View(1)とView(3)を選択し、高さと重量を等しく設定します。問題は解決しました。

私は助けるビデオをしました:

https://www.youtube.com/watch?v=s-CPN3xZS1A


0

[XCode 7.2およびiOS 9.2でテスト済み]

ストーリーボードのエラーと警告を抑制したのは、スクロールビューとコンテンツビュー(私の場合はスタックビュー)の固有のサイズプレースホルダーに設定していたためです。。この設定は、ストーリーボードのサイズインスペクターにあります。そして、それは言う-設計時の固有のコンテンツサイズを設定すると、Interface Builderでの編集中のビューにのみ影響します。ビューには、実行時にこの固有のコンテンツサイズはありません。

したがって、これを設定することで問題が発生することはないと思います。

注:ストーリーボードでは、スクロールビューのすべてのエッジをスーパービューに、スタックビューのすべてのエッジをスクロールビューに固定しています。私のコードでは、スクロールビューとスタックビューの両方で、translatesAutoresizingMaskIntoConstraintsをfalseに設定しています。また、コンテンツのサイズについては触れていません。stackviewが動的に大きくなると、ストーリーボードに設定された制約により、スタックがスクロール可能になります。

ストーリーボードの警告は私を怒らせており、警告を抑制するためだけに水平または垂直に物事を中央に置きたくありませんでした。


0

誰かが右スクロールのスクロールバーに気づいたがコンテンツが動かないという動作をしている場合、この事実はおそらく検討する価値があります:

スクロールビューのコンテンツとスクロールビュー外のオブジェクトとの間の制約を使用して、スクロールビューのコンテンツの位置を固定し、コンテンツがスクロールビュー上に浮かんでいるように見せることもできます。

これはAppleのドキュメントからです。たとえば、誤って上部のLabel / Button / Img / ViewをcontentViewではなくスクロール領域の外側のビュー(ヘッダーまたはscrollViewのすぐ上にあるもの)に固定してしまった場合、contentView全体を固定します。


0

以前の回答で述べたように、スクロールビュー内にカスタムビューを追加する必要があります。

カスタムビューは、画像でマークされたContentViewです。

すべてのサブビューをコンテンツビューに追加します。ある時点で、スクロールコンテンツビューにあいまいなコンテンツサイズの警告が表示されます。コンテンツビューを選択し、[IBレイアウトの右下隅にある] [自動レイアウトの問題を解決]ボタンをクリックして、[不足しているコンテンツを追加]を選択する必要があります。制約」オプション。

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

これからプロジェクトを実行すると、スクロールビューによってコンテンツのサイズが自動的に更新されるため、追加のコードは必要ありません。


0

スクロールビューの上から下に連続した制約を作成する方法があることを確認する必要があります。[-XXX]

私の場合-水平方向にスクロールするスクロールビュー-スクロールビューの子ごとに幅と高さの制約を追加する必要もありましたが、Appleのテクニカルノートには記載されていません。



0

UIScrollViewで問題が解決しない場合は、コンテンツレイアウトガイドをオフにし ます(xcodeインターフェイスビルダーでScrollViewを選択->右パネルでサイズインスペクターを選択-> [コンテンツレイアウトガイド]の選択を解除)または次の手順を試してください:xcode 11スクロールビューレイアウト -新しいスタイルのレイアウトに役立ちます。macOS 10.15.2、Xcode 11.3.1、05.02.2020で正常に動作します

スクリーンショットを見る


0

自動レイアウトの使用

明確に定義されたビュー内にスクロールビューを追加し、スクロールビュー内にスタックビューを追加します。

スクロールビューとスタックビューから関連するスーパービューに、上、左、右、下、中央X、中央Yの制約を追加します。

現在のデフォルト設定では上部スペース制約ではなく上部境界整列制約を追加するようになっているため、制約がスタックビューから正当なスーパービュー(スクロールビュー)にリンクされていることを確認してください。

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