質問: ### 前提・実現したいこと AutoLayoutでレイアウトを調整しているのですが、一つだけどうしても言うことを聞いてくれないものがあるのでアドバイスいただけると嬉しいです。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/0ff5143d9fa588fd64224ed76116ffb9.png) 画像がざっくりとしたレイアウトです。 縮尺が違いますが、左側がiPhone8、右側がiPad Proで表示される画面です。 赤枠のアスペクト比は1:1であるものとします。 StackViewAで「青・真ん中(赤枠)・青」を縦に並べています。 ー真ん中(赤枠)の中ではさらにStackViewBで「黄緑・水色」を縦に並べています。 ーー黄緑のView中には「ImageViewの上にLabelを重ね、それをViewの中に格納したもの」が3つ入っています。 ーー水色はStackViewCでラベルを横に3つ等間隔、等幅で並べています。 黄緑のViewでStackViewを使っていないのは、ImageViewとLabelの重なりがあるからです。 --- StackViewA、StackViewCには親Viewの横幅いっぱいになるように制約をかけています。 StackViewBには上下の青Viewに接するかつアスペクト比を1:1かつ水平方向中央の制約をかけました。 黄緑のViewには親ViewであるStackViewBにアスペクト比を保ったまま上、左、右の隙間が0になるように制約をかけました。 しかし、画像右側(iPadPro)のように画面サイズに左上に小さく表示されてしまいます。 仮に親View(StackView2)に対して水平(垂直)方向中央の制約をかけてみましたが全く反映されません。 . 手順としては黄緑のViewに制約をかけられているのですが、なぜ反映されないのでしょうか? Viewに対して制約をかけるときには他のUI部品やStackViewと違って何か制限があるのでしょうか? よろしくお願いします。 (StoryBoradを考えていますがコードでも問題ないです) . --- ### 試したこと(追記) 黄緑の中の部品がうまく制約できていないのが原因と思われます。 試しに別のViewControllerにて、View(グレー)の中にView(黄緑)を配置しました。 黄緑Viewの制約は画面右の通りです。 実際にやりたいことと同じように「グレーViewのトップに接する」「アスペクト比を固定」「グレーViewの水平方向中央」を制約した(つもり)のですが、反映されません。 この制約の仕方がわかれば解決できそうです。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/2dd13aad070f7307e717dddce4c60850.png)
回答: もともとやりたいことがうまくレイアウトできない原因は、実際のStoryboardの設定を見せてもらっていないのでよくわかりませんが、「試したこと(追記)」がエラーになる原因は制約の設定が足りないためです。 「アスペクト比を固定」は、縦横の比率を設定しているだけなので、このままでは黄緑のViewのサイズ(幅と高さ)が確定しません。 黄緑のViewに対して「幅」か「高さ」のどちらか一方を設定すれば、アスペクト固定の設定により、もう一方の「幅」または「高さ」も確定してエラーは消えます。 または、「左からの距離」か「右からの距離」のどちらか一方を設定すれば、「左右中央」の制約と合わせることでViewの「幅」が確定するので、それを元に「高さ」も確定し、エラーが消えます。 または、「下からの距離」を設定すれば、「上からの距離」の制約と合わせることでViewの「高さ」が確定するので、それを元に「幅」も確定し、エラーが消えます。 つまり「幅」「高さ」「左からの距離」「右からの距離」「上からの距離」のいずれか1つ制約を追加すれば、黄緑のViewのサイズが確定し、エラーは消えます。