19

テーブルビューとその中にセルがあります。セルには 3 つのラベルが含まれています。ヘッダー ラベルと、上下に並んだ 2 つのラベルです。データが含まれていない場合は、下の 2 つのラベルを非表示にし、「ヘッダー ラベル」の「トップ スペースからコンテナーへ」を「中央 Y からコンテナーへ」に変更する必要がある場合があります。もちろん、2 つのラベルにデータが含まれている場合は、制約を元に戻します。アイデアを示すためだけの簡単なデモ プロジェクトのスクリーンショットを次に示します。

ここに画像の説明を入力

更新Max MacLeod の回答は正しい方向を示しています。トリックは、1 番目と 2 番目のラベルが非表示になっているときにヘッダー ラベルを押し下げることです。そのため、ヘッダー ラベルのコンテナー ビューに上部スペースを作成する代わりに、1 番目と 2 番目のラベルのコンテナー ビューに下部スペースを設定する必要があります。また、非表示/再表示は、高さのアウトレット (最初と 2 番目のラベルの高さの制約) を設定し、それらの定数値をゼロに設定する (および再表示するときに値を元に戻す) ことによって行う必要があります。ソースコードのサンプルも Github にアップロードしました。

4

4 に答える 4

34

ヘッダー ラベルと下のラベルの 1 つを選択し、それらの間のギャップを反映する新しい垂直方向のスペース制約を追加します。次に、ヘッダー ラベルの上部スペースからコンテナーへの制約を削除します。たぶん、あなたはすでにこれを持っています(画面グラブからはよくわかりません)。もしそうなら、それは良いことです。

ここで、下のラベルごとに 2 つの高さの制約を作成します。IBOutletそれらをあなたのクラスに。

次に、必要に応じて、各高さの制約を に設定して、これら 2 つの下のラベルを非表示にconstant0.fます。

これにより、それらが非表示になり、上部のヘッダー ラベルが下がり、コンテナー内で垂直方向の中央 Y に配置されます。

もう一度手順を実行します (コメントするには長すぎました!)。古いものを削除する前に、最初に新しい制約を追加する必要があるため、IB ではシーケンスが重要です。一時的に、余分な制約が 1 つあります。それは、IB があいまいさを許さないからです。そのため、最初に新しい垂直方向のスペース制約を追加します。これにより、上部ラベルの Y 位置が定義されます。次に、上部のラベルからコンテナーの制約に対する余分な垂直方向のスペースを削除します。これで、そのラベルは、下のラベルに対する垂直方向のスペースを使用して Y 配置されます。次に、各下部ラベルの高さの制約を追加し、IBOutlet を使用してクラスにリンクします。もう1つ、実際には、下のスペースの制約で下のラベルをコンテナーに制限する必要があります。それらの高さが 0 になると消え、上のラベルは Y 中心位置になるように下に移動します。

元に戻すには、constantback を元の値に設定します。

これは、負荷の高い操作である制約の追加/削除よりもはるかに優れたアプローチです。2 つの下位ラベルを「コンテナ」ビューに追加して、1 つとして表示/非表示にできることに注意してください。また、垂直方向のスペースを 1 つだけではなく、上部ラベルと両方の下部ラベルの間に配置する必要があるため、コードが整頓されます。

私の回答AutoLayout with hidden UIViewsも参照してください。

于 2013-10-31T13:17:21.610 に答える
-3

めったに、簡単に理解できるいくつかの実践的な例を見つけることはできませんが、これは規則の例外の正確なケースです。

個人的には、この文書は非常に理解しやすく、明確であると感じました。時間内に自動レイアウトの第一人者になるための最良の方法:)

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutinCode/AutoLayoutinCode.html

基本的に、ランタイムは「プログラムによって」を意味します。

したがって、あなたの質問に対する答えは次のとおりです。

https://stackoverflow.com/a/12623006/517119

于 2013-10-31T13:16:59.973 に答える