1. ホーム
  2. ios

スクロールビュー内の動的サイズのコントローラを持つコンテナビューのサイズ調整

2023-09-25 05:56:42

質問

UIScrollViewの中に、高さを動的に設定できるコントローラを持つコンテナビューを作成し、オートレイアウトを使用して自動的にサイズを設定しようとしています。

ビューコントローラAはscrollviewで、コンテナビューが含まれており、さらに下にコンテンツがあります。

ビューコントローラBは、ダイナミックサイズを持ち、ビューコントローラAのスクロールビューにすべてのコンテンツをフルハイトで表示させたいビューコントローラです。

BのダイナミックサイズがAのコンテナビューのサイズを自動的に設定することに問題があります。しかし、Aのコンテナビューに高さの制約を設定すると、次のようになります。 ,

ビューコントローラBの高さが250であれば、これは期待される出力でしょう。高さ1000でも問題なく動作するので、私が知る限りでは、すべての自動レイアウト制約が適切に設定されています。残念ながら、高さは実際には動的であるべきなので、高さ制約をまったく設定しないようにしたいと思います。

ビューコントローラー B がコンテンツに応じて自動的にサイズを更新するために設定できるものがあるかどうか、または私が見逃している他のトリックがあるかどうかはわかりません。何か助けがあれば、とてもありがたいです。

高さの制約を設定せずに、ビューコントローラBの大きさに合わせてAのコンテナビューのサイズを変更する方法はありますか?

どのように解決するのですか?

ええ、ありますよ。私は自分のプロジェクトの1つで、そのような動作を実現することができました。

あなたがしなければならないことは、Interface Builderでルートビューに設定された固定フレームを模倣する制約を追加しないよう、システムに伝えることです。これを行う最適な場所は、埋め込みセグエがトリガされたときに、コンテナビューコントローラです。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // You might want to check if this is your embed segue here
    // in case there are other segues triggered from this view controller. 
    segue.destinationViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
}

重要です。

コンテナにロードするビューが上から下まで制約されていることを確認し、垂直制約の1つの優先順位を1000より低い値に設定する必要があります(これには常に下制約を使用するのがよい習慣です)。これは、そうしないと Interface Builder から文句を言われるからです (これには正当な理由があります)。

設計時に、ルートビューは固定サイズ (高さ) を持っています。今、すべてのサブビューが固定の高さを持ち、すべて同じ優先順位を持つ固定の制約で接続されている場合、固定のルートビューの高さが偶然にもサブビューと垂直制約の合計高さと一致しない限り、これらの要件をすべて満たすことは不可能です。もし、制約の1つの優先順位を999に下げると、Interface Builderはどの制約を解除すればよいかを知っています。しかし、実行時に translatesAutoresizingMaskIntoConstraints プロパティが設定されている場合、ルートビューの固定フレームはなくなり、システムは999の優先順位の制約を代わりに使用します。