1. ホーム
  2. ios

[解決済み] Autolayout を使用して UIScrollview に制約を設定するにはどうすればよいですか?

2022-04-21 01:17:32

質問

について、2日間かけて様々な解決策を試してきました。 混合型と純粋なAutolayoutのアプローチ オートレイアウト以前は些細なスクロールビューのセットアップであったものを実現するために、私はあまりにも愚かであるに違いないと公式に認められました。私はこれをほとんどStoryboardでセットアップしています(まあ、そういうものなのですが)。

そこで、私の懇願です。

ビューツリーです。

UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton

ボタンは水平方向にスクロールすることになっています(左から右、またはその逆)。どなたか お願い 純粋なAutolayoutを使用してこれを達成するために制約を設定する方法を教えてください。

--

というような、ミックスアプローチを試してみました。

UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton

...そして、固定幅と固定高さの制約を contentviewtranslatesAutoresizingMaskIntoConstraints の設定は、AppleのTechNoteに準じています。ボタンとスクロールビューはコンストレイントを使用して設定します。これでスクロールビューがスクロールするようになりました(やった)。私が知る限り、スクロールの幅は、私がcontentviewを設定したものから、どういうわけか2倍になっています?

純粋なオートレイアウトのアプローチも試してみました。 contentview としない。 すべて のビューは translatesAutoresizingMaskIntoConstraints=NO を除いては self.view . ボタンは固定された幅と高さの制約があり、スクロールビューの4つの端に固定されています。何もスクロールしません。

というわけで、なぜ正しく動作させることができないのか、まったくもって困惑しています。また、他の情報が必要な場合は、お問い合わせください。

解決策のスクリーンショットをアップしました。 buttonZの制約です。

EDIT @ Jamie Forrest つまり、解決策は最後のボタンの末尾の制約が間違っていたことが判明したのです。6441ではなく、私が設定した値はマイナスで、-6441でした。厄介なのは、ストーリーボードで値を設定するとき、ピンツールバーに2つのオプションがあることです。

現在のキャンバスの値はマイナス(スクロールしない)で、下のオプションはプラス(スクロールを有効にする)です。つまり、私は愚か者ではなく、少なくとも半盲なのだと思います。 しかし、私の防衛手段としては、XCodeが"incorrect"の設定に対してエラーを表示しないのは、多少気になりませんか?

再度編集しました。 これは面白い...末尾の値を-6441(スクロールなし)から6441に変更すると、スクロールが可能になりました。しかし、私の古い友人である "too much contentsize" が復活し、コンテンツ サイズがあるべきサイズの 2 倍になりました! 正しいコンテンツ スクロールを得るための解決策は、末尾の制約をゼロに設定することでした! これはStoryboardで作業しているときにはわからないことですが、@Infinity Jamesのコードを見ると、これがあるべき姿になっています。

解決方法は?

ここに貼り付けた制約の正確な値や設定を見るのは難しいので、スクリーンショットを見ただけでは、どこが間違っているのかわかりません。

あなたの設定の何が問題なのかを説明する代わりに、基本的な サンプルプロジェクト ビュー階層と制約の設定が非常によく似ていますね。このサンプルプロジェクトでは、水平スクロールは期待通りに動作します。 テクニカルノート .

また、元々Auto Layoutを動作させるのにかなり苦労していました。 UIScrollView . スクロールビューのすべてのアイテムが、一緒になって、最終的にスクロールビューのすべての側面にリンクする制約を持ち、AutoLayoutシステムがそのフレームよりも大きいスクロールビューのcontentSizeを決定できることに貢献することを確認することが、それを動作させる鍵になります。あなたのコードでそれをしようとしているように見えますが、多分、余分な制約があり、contentSizeを小さくし過ぎていたのでしょう。

また、他の方がおっしゃっているように、AutoLayout と UIScrollview では、もう明示的に contentSize を設定する必要はありません。AutoLayout Systemは、制約に基づいてcontentSizeを計算します。

また、次のようなものもありました。 この電子書籍の章 が、その仕組みを理解するのにとても役に立ちました。お役に立てれば幸いです。