web-dev-qa-db-ja.com

自動レイアウト(ios6 + ios7)を備えた4インチおよび3.5インチのiPhone画面に1つのストーリーボードを使用するにはどうすればよいですか?

4インチと3.5インチの両方の画面サイズで機能するストーリーボードレイアウトの構築については多くの質問と回答がありますが、次のシナリオに適したソリューションを見つけることができませんでした。

私はios6(およびios7)で自動レイアウトを使用しており、landscpaeまたはipadをサポートする必要はありません。以下のモックアップのように見える必要があるいくつかのサブビューを持つUIViewがあります。ストーリーボードに自動レイアウト制約を設定して、どちらの画面サイズにも合わせるのは簡単です。私の質問は--自動レイアウトに実行時の画面サイズに応じて正しい制約を選択させるにはどうすればよいですか?

SCREEN MOCKUPS

2つの異なるストーリーボードを使用したくないことに注意してください。アプリケーション全体でこれを行うのは大変な作業であり、各ストーリーボードのすべてのデリゲート、アウトレット、アクションを接続する必要があります。画面を変更すると、2倍の作業が必要になります。

1つのストーリーボードでこれを機能させるために2つの方法を試しましたが、どちらにも満足していません。

  • 制約を2倍にします。大きい方の制約(50)は、小さい方の制約(30)よりも優先度が高くなります。このアプローチの問題は、3.5インチの画面サイズでは、自動レイアウトが優先度の低い制約をいくつか選択する可能性があることです。これは、レイアウトを満たすのに十分ですが、優先度の高い制約がいくつか残ります。

double constraints

  • サブクラスNSLayoutConstraint。このメソッドでは、ストーリーボードのすべての制約がNSDualLayoutConstraintに設定されます。 NSDualLayoutConstraintの初期化コードでは、ランタイム画面サイズが3.5 "の場合、制約の定数が3_5_constantの値に変更されます。この方法はより決定論的ですが、InterfaceBuilderプレビューに3.5"レイアウトが表示されません。 。

enter image description here


画面サイズが3.5 "のときに適用されるセカンダリ定数値がInterfaceBuilderの制約のみにある場合、問題は解決します。それで、私は質問を続けます。単一のストーリーボードを適切に使用して、サブビューを正しくレイアウトするにはどうすればよいですか。 4 "および3.5"の画面サイズ?

25
gardenofwine

ストーリーボードを1つだけ使用し、自動レイアウトを使用したくない場合は、ダイアグラムに表示した内容をはるかに簡単にするため、ビューをコードでレイアウトする必要があります。

ユーザーが4インチのデバイスで実行されているかどうかを検出し、それに応じてビューをレイアウトする必要があります。

#define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)

if (IS_568_SCREEN) {
    // Lots of code to layout for 4" devices
} else {
    // Lots of code to layout for 3.5" devices
}

ただし、これに自動レイアウトを使用する場合は、時間とコードを大幅に節約できることがわかります。上記のソリューションを使用してコード内のすべてのビューを手動でレイアウトする代わりに、デバイスに応じてyと高さの制約を更新するだけで済みます。

自動レイアウトが処理するものと手動で更新する必要があるものを示すこの図を考慮すると、これは自動レイアウトを利用することでどれだけ節約できるかをより正確に描くのに役立つはずです。

enter image description here

#define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)

if (IS_568_SCREEN) {
    self.layoutConstraintY.constant = 50.0f;
    self.layoutConstraintHeight.constant = 248.0f;
} else {
    self.layoutConstraintY.constant = 30.0f;
    self.layoutConstraintHeight.constant = 220.0f;
}
[self layoutIfNeeded];
6
Jeremy Fox

この stackoverflow answer は私にとって同じ問題を解決しました。

重要なのは、制約(高さなど)に対してIBOutletを作成することです。次に、このようなことをします

- (void)updateViewConstraints {
    [super updateViewConstraints];

    self.myConstraintFromIB.constant =
        [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}
2
carbonr

プログラムで制約を編集する必要があります。 この質問はそのために役立つかもしれません。

2つの別々のストーリーボードファイル、または1つのストーリーボードファイルに2つのviewControllerシーンを含めることもできます。

1
WolfLink

ビューを追加して、その中に正方形のビューを含めるのはどうですか?余分なビューは、誰にも見られないように透明にする必要があります。追加ビューの制約を設定して画面サイズに合わせて拡大し、正方形ビューの制約を追加ボックスの中央に設定します。追加のボックスを基準にした正方形のビューサイズの乗数を選択します

1
Martin Lockett