1. ホーム
  2. ios

[解決済み] autolayout を使ってサブビューが動的に変更された後にスーパービューをリサイズする

2023-07-05 16:24:20

質問

このリサイズスーパービューのコツがどうしてもわかりません。

私は UIView *superview で、4つの UILabels . 2つは他の2つのヘッダーとして機能します。

4つのコンテンツはすべて、データベースから来る動的なものです。

SizeToFitSizeThatFits:(CGSize)UIView systemLayoutSizeFittingSize: のどちらかを渡します。 UILayoutFittingCompressedSize または UILayoutFittingExpandedSize .

プログラム的にautolayoutを使用しており、スーパービューの高さがダミーの数値と同じかそれ以上になるように設定しています。

どこで、どのように、これらの SizeToFitsizeThatFits:(CGSize)UIView systemLayoutSizeFittingSize: のどちらかを渡します。 UILayoutFittingCompressedSize または UILayoutFittingExpandedSize . 私はここでスタック上の多くのヒントを読みましたが、結局何もありませんでした。

どこか特定の場所でスーパービューの制約を再計算する必要がありますか。そのコントローラクラスで高さを´@property`に設定し、それを削除して読み取ることができますか? 現在、私はすべての場所を配置し、さらにいくつかのことを試してみました。それでも、ダミーの高さとテキストが外に浮いた状態で、同じサイズの最終結果が得られます。サブビューにclipsToBoundを設定した後でも。

私は私の髪を掻いています... 助けてください。

どのように解決するには?

オートレイアウトを使用している場合、以下のようになります。

  1. サブビューに固定幅および/または高さの制約を追加していないことを確認します (動的にサイズ調整したい寸法に依存します)。このアイデアは、各サブビューの固有のコンテンツ サイズがサブビューの高さを決定するようにすることです。 UILabel には4つの自動的な暗黙の制約があり、ラベルのフレームを内部のすべてのテキストに適合するために必要な正確なサイズに維持しようとします(優先度は Required より低い)。

  2. 各ラベルのエッジが、互いのエッジとそのスーパービューに(Required priority制約で)硬く接続されていることを確認します。ラベルの1つが大きくなることを想像した場合、これは他のラベルにそのためのスペースを作ることを強制し、最も重要なことは、スーパー ビューも同様に拡大することを強制することを確認したいと思います。

  3. サイズではなく、位置を設定するためにのみ、制約をスーパービューに追加します(少なくとも、動的にサイズ変更したい寸法ではありません)。内部制約を正しく設定した場合、そのエッジが何らかの方法でサブビューに接続されるため、そのサイズはすべてのサブビューのサイズによって決定されることを覚えておいてください。

これで終わりです。を呼び出す必要はありません。 sizeToFit または systemLayoutSizeFittingSize: を実行するには、ビューをロードしてテキストを設定するだけです。システムレイアウトエンジンは、制約を解決するための計算を行います。(何かあれば setNeedsLayout を呼び出す必要があるかもしれませんが、これは必要ないでしょう)。