0

サイズ クラスの制約を更新するために UITraitCollection クラスを使用しますか? これは制約を更新するためのベスト プラクティスですか?

UITraitCollection を調べましたが、ポートレートとランドスケープを区別する方法がわかりませんか?

4

1 に答える 1

1

iPad の向きに基づいて異なるレイアウトが必要なようです。制約値を調整するだけでよい場合は、とプロパティを確認できUITraitCollectionます。サイズ クラス プロパティの値は、Apple のドキュメントで確認できます。これがベスト プラクティスであることを保証することはできませんが、問題はないと思います。をチェックする代わりに、以下のコード スニペットに示すようにチェックすることもできます。horizontalSizeClassverticalSizeClassUIUserInterfaceSizeClassUITraitCollectionUIInterfaceOrientationIsPortrait

より複雑なシナリオでは、横向きと縦向きでまったく異なる制約を使用する必要があります。これらの制約の追加をプログラムで処理することも、別のサイズ クラスを使用して制約を追加してIBOutletCollectionから、向きに基づく各サイズ クラスの制約用の を作成することもできます。

たとえば、wAnyhRegular を使用して縦向きの iPad レイアウトをセットアップし、次に wRegularhAny を使用して横向きの iPad レイアウトをセットアップしました。(ただし、iPad は をチェックすると wRegular/hRegular として登録されるため、方向レイアウトの 1 つとして wRegular/hRegular を使用することをお勧めしますUITraitCollection。うまくいけば、以下のコードは、私がどのように行ったかを示しています。

@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *iPadPortraitConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *iPadLandscapeConstraints;

私のポートレートの制約を以下に示します。私のランドスケープにも 3 つの制約があります。 縦長の制約

次に、以下に示すように制約を適用します (表示されていません。viewDidLoad が実行されます_needsiPadConstraintsApplied = YES;)。

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    [self applyiPadConstraints];
}

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    //  Size Classes does not support differentiating between iPad Portrait & Landscape.
    //  Signal that the iPad rotated so we can manually change the constraints.
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        _needsiPadConstraintsApplied = YES;
    }
}
- (void)applyiPadConstraints {

    if (_needsiPadConstraintsApplied) {

        if (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) {
            [NSLayoutConstraint deactivateConstraints:self.iPadLandscapeConstraints];
            [NSLayoutConstraint activateConstraints:self.iPadPortraitConstraints];

        } else {
            [NSLayoutConstraint deactivateConstraints:self.iPadPortraitConstraints];
            [NSLayoutConstraint activateConstraints:self.iPadLandscapeConstraints];
        }

        _needsiPadConstraintsApplied = NO;
    }
}

そして最後に、このサイズ クラスの調査が役に立つかもしれません。

于 2015-04-15T23:07:16.410 に答える