Apple 推出 iOS 8尺码等级用于处理应用程序的布局。我们鼓励开发人员根据活动尺寸类别调整应用程序的布局,而不是根据设备、屏幕尺寸和方向来设计用户界面。我认为这是一个很好的举措。
However, when it comes to the iPad there seem to be no way to distinguish the different device orientations (which provide quite different screen space and handling in my opinion). From the Human Interface Guidelines:
What am I supposed to do now if I want to present a side menu only in landscape orientation because it provides more space, like a UISplitViewController
?
Is the UISplitViewController
另一种情况是,苹果不吃自己的狗粮,而是使用其他一些指标(例如设备方向或实际屏幕宽度)来确定布局?或者还有其他官方方法可以做到这一点吗?我可以在 Interface Builder 中单独做一些事情而无需代码吗?
(不,我不想使用UISplitViewController
有几个原因。)
这就是我解决您遇到的问题的方法:
使用不同的尺寸类别添加纵向和横向的约束(您似乎正在这样做),然后创建一个IBOutletCollection
基于方向的每个尺寸类别的约束。
例如,我使用 wAnyhRegular 设置我的纵向 iPad 布局,然后使用 wRegularhAny 设置我的横向 iPad 布局。 (尽管您可能希望使用 wRegular/hRegular 作为方向布局之一,因为当您检查UITraitCollection
。希望下面的代码演示了我是如何做到这一点的:
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *iPadPortraitConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *iPadLandscapeConstraints;
My portrait constraints can be seen below. My landscape has 3 constraints as well.
然后,我应用如下所述的约束(未显示,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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)