25

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

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

画面のモックアップ

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

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

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

二重制約

  • NSLayoutConstraint をサブクラス化します。このメソッドでは、ストーリーボードのすべての制約が NSDualLayoutConstraint に設定されます。NSDualLayoutConstraint の初期化コードでは、実行時の画面サイズが 3.5 インチの場合、制約の定数が 3_5_constant の値に変更されます。この方法はより決定論的ですが、インターフェイス ビルダーのプレビューで 3.5 インチのレイアウトを確認することはできません。 .

ここに画像の説明を入力


画面サイズが 3.5 インチのときに適用される 2 次定数値がインターフェイス ビルダーの制約のみにあれば、問題は解決します。画面サイズは 4 インチと 3.5 インチ?

4

4 に答える 4

6

ストーリーボードを 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
}

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

自動レイアウトが何を処理し、何を手動で更新する必要があるかを示すこの図を考慮すると、自動レイアウトを利用することでどれだけ節約できるかをよりよく理解するのに役立ちます.

ここに画像の説明を入力

#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];
于 2014-01-22T14:02:46.343 に答える
2

このスタックオーバーフローの回答は、私にとって同じ問題を解決しました。

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

- (void)updateViewConstraints {
    [super updateViewConstraints];

    self.myConstraintFromIB.constant =
        [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}
于 2014-04-28T13:31:14.183 に答える
1

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

2 つの別個の Storyboard ファイル、または 1 つの Storyboard ファイルに 2 つの viewController シーンを含めることもできます。

于 2013-11-21T22:03:07.197 に答える
1

余分なビューを追加して、その中に正方形のビューを含めてみませんか? 追加のビューは透明にして、誰にも見えないようにする必要があります。エクストラ ビューの制約を画面サイズに合わせて拡張するように設定し、スクエア ビューの制約をエクストラ ボックスの中央に配置するように設定します。追加のボックスに対する正方形のビュー サイズの乗数を選択します

于 2014-11-21T16:13:03.117 に答える