web-dev-qa-db-ja.com

自動レイアウトを使用する場合のUIScrollViewのcontentSizeの計算

ここでは、うまく機能するものの、もっとよく書けるものについての簡単な質問を示します。 UIScrollViewと、内部にレイアウトされたオブジェクトのリストが1つ下にあります。すべてがviewDidLoad()の間に行われ、オブジェクトの配置にはAuto LayoutcontentSizeUIScrollViewの高さを適切な値に設定するために行うことは次のとおりです。

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    globalView.contentSize = CGSize(width: globalView.frame.width,
                                    height: globalView.frame.height * 1.59)
}

それは機能しますが、任意の値1.59は、いくつかの可能な値を試すことによって明らかに決定されました。 そのような場合にcontentSizeを計算する適切な方法は何ですか?すべてをプログラムで実行しています。ネットを検索しても簡単で明確な答えは得られなかったので、多少重複した質問かもしれませんが、再定式化することにしました。

16
Michel

プログラムでコンテンツサイズを指定するのは良い方法ではありません。自動レイアウトを使用して機能する以下のソリューションでは、コンテンツサイズを設定する必要はありません。ビューに追加されたUIフィールドの数ごとに計算します。

ステップ1:

Scrollviewを追加してストーリーボードに表示し、先頭、末尾、上部および下部の制約を追加します(すべての値はゼロです)。

ステップ2:

直接スクロールビューで必要なビューを直接追加しないでください。まず、1つのビューをスクロールビューに追加します(すべてのUI要素のコンテンツビューになります)。このビューに以下の制約を追加します。

1)先行、後続、上部および下部の制約(すべての値はゼロです)。

2)メインビュー(つまり、スクロールビューを含む)に同じ高さ、同じ幅を追加します。高さが等しい場合は、優先度を低に設定します。 (これはコンテンツサイズを設定するための重要なステップです)

3)このコンテンツビューの高さは、ビューに追加されたビューの数に従います。最後に追加したビューが1つのラベルで、Yの位置が420、高さが20の場合、コンテンツビューは440になります。

ステップ3:要件に従ってコンテンツビュー内に追加したすべてのビューに制約を追加します。

参考のために :

enter image description here

enter image description here

これがあなたのお役に立てば幸いです。

73
Shrikant K

私はついにこの問題を解決し、物事を機能させることができましたが。関連する回答がストーリーボードユーザーに向けられていたので、ネット上で見つけることができるすべてに気付きました。しかし、プログラムでそれを行うことは何もありません。

そこで、これを実現する方法を示すために、非常にシンプルなデモアプリを作成することにしました。いつか誰かの役に立つことを願っています。

GitHubで入手するアドレスは次のとおりです。 https://github.com/zaxonus/AutoLayScroll

2
Michel

また、プログラムで制約を使用して、UIScrollViewのcontentSizeを動的に変更しました。私はShrikantの指示にほぼ従っていましたが、ステップ2.1では、先頭と末尾のマージンを設定するのではなく、centerXをscrollViews.centerXに設定しました(前者が動作する理由はわかりませんが、後者は動作しません)。最後のステップとして、最後のサブビューを追加した後、次のことを行いました。

contentView.layoutIfNeeded() //set a frame based on constraints
scrollView.contentSize = CGSize(width: contentView.frame.width, height: contentView.frame.height)

これが将来誰かを助けることを願っています。

1
temlocke