2015-07-02 45 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; 
    } 
}