我应该使用 UITraitCollection 类来更新大小类约束吗?这是更新约束的最佳实践吗?
我已经通过了UITraitCollection,但不知道如何区分纵向和横向?
我应该使用 UITraitCollection 类来更新大小类约束吗?这是更新约束的最佳实践吗?
我已经通过了UITraitCollection,但不知道如何区分纵向和横向?
听起来您想要基于 iPad 方向的不同布局。如果您只需要调整约束值,则可以检查UITraitCollection
'shorizontalSizeClass
和verticalSizeClass
属性。尺寸类属性值可以在 Apple 文档中找到UIUserInterfaceSizeClass
。我不能保证这是最佳实践,但我认为它没有任何问题。检查的替代方法是检查UITraitCollection
如下UIInterfaceOrientationIsPortrait
代码片段中所示。
更复杂的场景需要对横向和纵向使用完全不同的约束。您可以以编程方式处理添加这些约束,或者您可以使用不同的尺寸类来添加约束,然后IBOutletCollection
为基于方向的每个尺寸类创建一个约束。
例如,我使用 wAnyhRegular 设置纵向 iPad 布局,然后使用 wRegularhAny 设置横向 iPad 布局。(虽然您可能希望使用 wRegular/hRegular 作为您的方向布局之一,因为 iPad 在您检查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;
}
}
最后,您可能会发现这种对大小类别的探索很有帮助。