区分iPad方向与尺寸等级

时间:2015-07-02 16:21:47

标签: ios ipad layout ios8 size-classes

借助iOS 8,Apple推出了尺寸类来处理应用程序的布局。不是根据设备,屏幕大小和方向设计用户界面,而是鼓励开发人员根据活动大小类调整其应用程序的布局。我认为这是一个很好的举动。

然而,当涉及到iPad时,似乎无法区分不同的设备方向(在我看来,它提供了截然不同的屏幕空间和处理)。来自Human Interface GuidelinesiPad Size Classes 如果我想仅以横向方式呈现侧边菜单,我现在该怎么办,因为它提供了更多空间,如UISplitViewController

UISplitViewController另一个案例是Apple没有吃它自己的狗食,并使用其他指标,如设备方向或实际屏幕宽度来确定布局?或者还有另一种官方方式吗?在没有代码的情况下,我可以在Interface Builder中做些什么?

(不,我不想因为几个原因而使用UISplitViewController。)

1 个答案:

答案 0 :(得分:6)

这就是我解决您遇到的问题的方法:

使用不同的大小类来添加纵向和横向的约束(您似乎正在做),然后为基于方向的每个尺寸类的约束创建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个限制。 Portrait Constraints

然后我按照下面的说明应用约束(未显示,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;
    }
}