web-dev-qa-db-ja.com

UIScrollView +中央表示+あいまいなスクロール可能なコンテンツサイズ+多くのiPhoneサイズ

私が持っています:

  • 横向きおよび縦向きモードで動作するアプリケーション。
  • 上部にフルサイズのスクロールビューがあるビュー。
  • 幅と高さが固定されたスクロールビュー内の一部のビュー。 (HおよびW制約を追加)
  • スクロールビューの内側をコンテナーの水平方向の中央に表示するように設定します。 (制約に応じて追加)

インターフェースビルダーに「スクロール可能なコンテンツの幅があいまいです」という警告が表示されます。 enter image description here

私が知っているこの問題を修正する唯一の方法は、トレーリング制約とリーディング制約を設定することです。しかし、異なるiPhone(5.5 "、4.7"、4 ")については、異なる後続および先行制約を設定する必要があります。

この警告を解消し、すべてのiPhoneサイズでWとHを固定したまま水平方向のビューを中央に表示するにはどうすればよいですか?

この問題を説明するためにGithubリポジトリを作成します。 ScrollViewAmbigous

これは IScrollView Scrollable Content Size Ambiguity の複製ではありませんが、似ています(ただし回答はありません)が、この質問は特に異なるサイズのiPhoneに関連しています。

22
skywinder

朝、新鮮なコーヒーを飲みながら、この問題の回避策を見つけました!

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

  1. すべてのエッジに0の制約を持つscrollView
  2. 幅と高さが固定された水平および垂直のボタン中心
  3. そしてもちろん Has ambiguous scrollable content widthおよびHas ambiguous scrollable content height迷惑な警告

1

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

  • 2つの追加の制約を追加します。たとえば、ビューの末尾および/または下部スペースに「0」を使用します(私の場合-UIButton)

重要:トレーリングおよび/またはボトム制約を追加する必要があります。 「トップでトップ」ではありません-それはうまくいきません!

2

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

PS

私はそれが機能する理由とXcodeがどの制約がより優先されているかをどのように検出するのか分かりません(これらの制約に明示的に優先順位を設定していないため).

46
skywinder

問題

  1. この警告は、スクロールビューのコンテンツサイズがそのサブビューに依存することを示しています。
  2. サブビューには位置とサイズの厳密な規則はありませんが(固定された制約はありません)、nibが生成するスクロールビューのコンテンツサイズを混乱させます。

ソリューション

  1. Scrollviewの「contentView」として1つのサブビューのみを作成します。
  2. その 'contentView'に厳密な(修正された)制約を追加します。

    ベストプラクティス:スクロールビューと同じ幅と高さ。

  3. 他のすべてのサブビューと制約を「contentView」に追加します。
8
Timur X.

この問題には多くの混乱があるようです。私の見解は、UIScrollViewには[〜#〜] two [〜#〜]末尾のスペース制約、サブビューの1つに接続する「内部」制約が必要であるということです(したがって、コンテンツの幅を知ることができます)、およびそれを兄弟またはスーパービューに接続する別の「外側」のもので、フレーム幅を認識します。

同じ原則が高さにも適用されます。つまり、2つの下部スペースの制約です。

0
Reuben Scratton