借助iOS 8,Apple推出了尺寸类来处理应用程序的布局。不是根据设备,屏幕大小和方向设计用户界面,而是鼓励开发人员根据活动大小类调整其应用程序的布局。我认为这是一个很好的举动。
然而,当涉及到iPad时,似乎无法区分不同的设备方向(在我看来,它提供了截然不同的屏幕空间和处理)。来自Human Interface Guidelines:
如果我想仅以横向方式呈现侧边菜单,我现在该怎么办,因为它提供了更多空间,如UISplitViewController
?
UISplitViewController
另一个案例是Apple没有吃它自己的狗食,并使用其他指标,如设备方向或实际屏幕宽度来确定布局?或者还有另一种官方方式吗?在没有代码的情况下,我可以在Interface Builder中做些什么?
(不,我不想因为几个原因而使用UISplitViewController
。)
答案 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个限制。
然后我按照下面的说明应用约束(未显示,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;
}
}