区分iPad方向与尺寸等级

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

然而,当涉及到iPad时,似乎没有办法区分不同的设备方向(在我看来,它提供了截然不同的屏幕空间和处理)。 来自人机界面指南 : iPad尺寸类 如果我想仅以横向方式呈现侧边菜单,因为它提供了更多空间,如UISplitViewController ,我现在该UISplitViewController办?

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

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

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

使用不同的大小类来添加纵向和横向的约束(您似乎正在做)然后为基于方向的每个尺寸类的约束创建IBOutletCollection

例如,我使用wAnyhRegular设置我的纵向iPad布局,然后使用wRegularhAny设置我的横向iPad布局。 (虽然您可能希望使用wRegular / hRegular作为您的方向布局之一,因为当您检查UITraitCollection时,iPad会注册为wRegular / 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)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; } }