縮尺に合わせて説明しているのではありません。あなたはアスペクトフィットを説明しています。(この点に関してあなたの質問を編集しました。)サブビューは、アスペクト比を維持し、完全に親の内部に収まるようにしながら、できるだけ大きくなります。
とにかく、自動レイアウトでこれを行うことができます。Xcode 5.1以降、IBで完全に実行できます。いくつかのビューから始めましょう:
薄緑色のビューのアスペクト比は4:1です。濃い緑色のビューのアスペクト比は1:4です。青いビューが画面の上半分を塗りつぶし、ピンクのビューが画面の下半分を塗りつぶすように制約を設定し、それぞれの緑のビューを縦横比を維持しながら拡大して、容器。
最初に、青いビューの4辺すべてに制約を作成します。距離を0にして、各エッジの最も近い隣に固定します。マージンをオフにしてください。
私がいることを注意していない、まだフレームを更新します。制約を設定するときは、ビューの間にスペースを空けておき、定数を手動で0(またはその他)に設定する方が簡単だと思います。
次に、ピンク色のビューの左端、下端、右端を最も近い隣に固定します。上端が青いビューの下端にすでに制限されているため、上端の制限を設定する必要はありません。
また、ピンクとブルーのビューの高さを同じにする必要があります。これにより、それぞれが画面の半分に表示されます。
Xcodeにすべてのフレームを今すぐ更新するように指示すると、次のようになります。
したがって、これまでに設定した制約は正しいです。それを元に戻し、薄緑色のビューで作業を開始します。
ライトグリーンビューにアスペクトフィットするには、5つの制約が必要です。
- 薄緑色のビューに必要な優先アスペクト比の制約。この制約は、Xcode 5.1以降のXIBまたはストーリーボードで作成できます。
- ライトグリーンビューの幅をコンテナの幅以下に制限する必須優先度制約。
- ライトグリーンビューの幅をコンテナの幅と等しくなるように設定する優先度の高い制約。
- ライトグリーンビューの高さをコンテナの高さ以下に制限する必須優先度制約。
- ライトグリーンビューの高さをコンテナの高さと等しくなるように設定する優先度の高い制約。
2つの幅の制約を考えてみましょう。ライトグリーンビューの幅を決定するには、それよりも小さいか等しいという制約だけでは不十分です。多くの幅が制約に適合します。あいまいさがあるため、autolayoutは他の(優先度は高いが必須ではない)制約のエラーを最小限に抑えるソリューションを選択しようとします。エラーを最小限に抑えるということは、幅をコンテナの幅にできるだけ近づけることを意味しますが、必要とされる以下の制約に違反しません。
高さの制約でも同じことが起こります。また、アスペクト比の制約も必要なため、1つの軸に沿ってサブビューのサイズを最大化できるだけです(コンテナーがサブビューと同じアスペクト比を持たない限り)。
したがって、最初にアスペクト比の制約を作成します。
次に、コンテナで幅と高さの等しい制約を作成します。
これらの制約を編集して、以下の制約になるようにする必要があります。
次に、コンテナで同じ幅と高さの制約の別のセットを作成する必要があります。
そして、これらの新しい制約を必要な優先度よりも低くする必要があります。
最後に、サブビューをコンテナの中央に配置するように求めたので、これらの制約を設定します。
次に、テストするために、ビューコントローラーを選択し、すべてのフレームを更新するようにXcodeに要求します。これは私が得るものです:
おっとっと!サブビューが拡張されて、コンテナーが完全にいっぱいになりました。これを選択すると、実際にはアスペクト比が維持されていることがわかりますが、アスペクトフィットではなくアスペクトフィルを実行しています。
問題は、以下の制約では、制約の両端にあるビューが重要であり、Xcodeが私の期待とは逆の制約を設定したことです。2つの制約をそれぞれ選択し、その最初と2番目の項目を逆にすることができます。代わりに、サブビューを選択して、制約を次の値以上に変更します。
Xcodeはレイアウトを更新します。
今、私は底の濃い緑色のビューにすべて同じことをします。そのアスペクト比が1:4であることを確認する必要があります(Xcodeには制約がないため、奇妙な方法でサイズが変更されました)。手順は同じなので、再度表示することはありません。結果は次のとおりです。
これで、使用しているIBとは画面サイズが異なるiPhone 4Sシミュレーターで実行し、回転をテストできます。
そして、私はiPhone 6シミュレータでテストすることができます:
私はあなたの便宜のために私の最終的なストーリーボードをこの要旨にアップロードしました。