2015-07-02 44 views
2

使用iOS 8苹果引入尺寸类别用于处理应用程序的布局。我们鼓励开发人员根据活动大小类别调整其应用的布局,而不是根据设备,屏幕大小和方向设计用户界面。我认为这是一个很好的举措。区分iPad方向与尺寸类别

但是,谈到iPad时,似乎没有办法区分不同的设备方向(在我看来,这提供了完全不同的屏幕空间和处理能力)。从Human Interface GuidelinesiPad Size Classes 我现在应该做什么,如果我只想呈现横向方向的侧面菜单,因为它提供了更多的空间,如UISplitViewController

UISplitViewControllerUISplitViewController另一种情况是苹果不吃它自己的狗粮,并使用一些其他指标如设备方向或实际屏幕宽度来确定布局?还是有另一种官方的方式来做到这一点?无需代码,我可以在Interface Builder中独自完成一些操作?

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

回答

5

这是我如何解决你所遇到的问题:添加约束

使用不同尺寸的类对于纵向和横向(您似乎正在这样做),然后为基于方向的每个尺寸等级的约束创建一个IBOutletCollection

例如,我使用wAnyhRegular来设置我的肖像iPad布局,然后使用wRegularhAny来设置我的风景iPad布局。 (虽然你可能想使用wRegular/hRegular为您的方向布局之一,因为iPad上注册为wRegular/hRegular当您检查UITraitCollection希望下面的代码演示了我如何去了解它。

@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; 
    } 
}