【问题标题】:UITraitCollection Class for Updating the Size Class用于更新大小类的 UITraitCollection 类
【发布时间】:2015-06-21 10:05:01
【问题描述】:

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

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

【问题讨论】:

    标签: ios ipad storyboard size-classes uitraitcollection


    【解决方案1】:

    听起来您想要基于 iPad 方向的不同布局。 如果您只需要调整约束值,您可以检查UITraitCollectionhorizontalSizeClassverticalSizeClass 属性。尺寸类属性值可在 Apple 文档中找到 UIUserInterfaceSizeClass。我不能保证这是最佳实践,但我认为它没有任何问题。检查UITraitCollection 的另一种方法是检查UIInterfaceOrientationIsPortrait,如下面的代码sn-p 所示。

    更复杂的场景需要对横向和纵向使用完全不同的约束。您可以通过编程方式添加这些约束,或者您可以使用不同的尺寸类来添加约束,然后为基于方向的每个尺寸类的约束创建一个IBOutletCollection

    例如,我使用 wAnyhRegular 设置纵向 iPad 布局,然后使用 wRegularhAny 设置横向 iPad 布局。 (尽管您可能希望使用 wRegular/hRegular 作为您的方向布局之一,因为当您检查 UITraitCollection 时 iPad 注册为 wRegular/hRegular。希望下面的代码演示了我是如何做到的:

    @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;
        }
    }
    

    最后,您可能会发现这个exploration of size classes 很有帮助。

    【讨论】:

    • 你不应该使用 statusBarOrientation。你应该使用 UITraitCollection 作为一个变量来检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多