0

我应该使用 UITraitCollection 类来更新大小类约束吗?这是更新约束的最佳实践吗?

我已经通过了UITraitCollection,但不知道如何区分纵向和横向?

4

1 回答 1

1

听起来您想要基于 iPad 方向的不同布局。如果您只需要调整约束值,则可以检查UITraitCollection'shorizontalSizeClassverticalSizeClass属性。尺寸类属性值可以在 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;
    }
}

最后,您可能会发现这种对大小类别的探索很有帮助。

于 2015-04-15T23:07:16.410 回答