サイズ クラスの制約を更新するために UITraitCollection クラスを使用しますか? これは制約を更新するためのベスト プラクティスですか?
UITraitCollection を調べましたが、ポートレートとランドスケープを区別する方法がわかりませんか?
サイズ クラスの制約を更新するために UITraitCollection クラスを使用しますか? これは制約を更新するためのベスト プラクティスですか?
UITraitCollection を調べましたが、ポートレートとランドスケープを区別する方法がわかりませんか?
iPad の向きに基づいて異なるレイアウトが必要なようです。制約値を調整するだけでよい場合は、とプロパティを確認できUITraitCollection
ます。サイズ クラス プロパティの値は、Apple のドキュメントで確認できます。これがベスト プラクティスであることを保証することはできませんが、問題はないと思います。をチェックする代わりに、以下のコード スニペットに示すようにチェックすることもできます。horizontalSizeClass
verticalSizeClass
UIUserInterfaceSizeClass
UITraitCollection
UIInterfaceOrientationIsPortrait
より複雑なシナリオでは、横向きと縦向きでまったく異なる制約を使用する必要があります。これらの制約の追加をプログラムで処理することも、別のサイズ クラスを使用して制約を追加して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;
}
}
そして最後に、このサイズ クラスの調査が役に立つかもしれません。