【问题标题】:Distinguish iPad orientation with size classes用尺寸等级区分 iPad 方向
【发布时间】:2015-09-20 06:59:07
【问题描述】:
在 iOS 8 中,Apple 引入了 size 类 来处理应用程序的布局。与其根据设备、屏幕尺寸和方向来设计用户界面,不如鼓励开发人员根据活动的尺寸类别调整其应用程序的布局。我认为这是一个很好的举措。
但是,对于 iPad,似乎无法区分不同的设备方向(在我看来,它们提供了完全不同的屏幕空间和处理方式)。来自Human Interface Guidelines:
如果我只想以横向显示侧面菜单,因为它提供更多空间,我现在应该怎么做,例如 UISplitViewController?
UISplitViewController 是否是 Apple 不吃自己的狗粮并使用设备方向或实际屏幕宽度等其他指标来确定布局的另一种情况?还是有另一种官方的方式来做到这一点?我可以在不使用代码的情况下单独在 Interface Builder 中做些什么?
(不,我不想使用UISplitViewController 有几个原因。)
【问题讨论】:
标签:
ios
ipad
layout
ios8
size-classes
【解决方案1】:
这就是我解决您遇到的问题的方法:
使用不同的尺寸类为纵向和横向添加约束(您似乎正在这样做),然后为基于方向的每个尺寸类的约束创建一个 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;
}
}