1. 程式人生 > >NavigationController單個介面橫屏,其他全豎屏

NavigationController單個介面橫屏,其他全豎屏

由於自己沒有mac裝置,x200裝黑蘋果失敗,本文的程式碼全靠記憶,如有錯誤之處敬請指正。
最近在做一個帶有報表的iOS App開發,要求從記錄介面轉到圖表介面時從豎屏轉為橫屏。

首先在info.plist中有關於app支援的螢幕方向設定,預設支援豎屏和橫屏(iphone預設不支援倒立)。如果想讓自己的app只支援橫屏或者豎屏建議在該檔案中修改,比在程式碼中修改要方便得多。

在storyboard或者ib中,需要將橫屏的XXViewController的方向屬性(orientation)改為Landscape。

如果使用modal等方式切換介面,經過以上步驟,就可以看到載入的介面為橫屏。

如果使用push,需要在橫屏ViewController中新增以下程式碼:

if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
    [[UIDevice currentDevice] performSelector:@selector(setOrientation:)
                                   withObject:(id)UIInterfaceOrientationLandscapeRight];
}
如果需要橫屏的ViewController不是NavigationController push過來的話,就可以看到載入介面後自動旋轉成橫屏了。

網上的說法是這樣不保險,更安全(過蘋果的稽核)的方法是更改view.transform屬性。這樣需要的操作太多,由於專案離釋出還有一段時間,我嘗試了一下,發現旋轉後導航欄的高度沒有自動調整,便暫時擱置了。

如果在使用NavigationController時,需要限定某些介面為豎屏,而另外一些介面為橫屏或者可以旋轉,需要新建一個UINavigationController的子類,根據需要重寫它的一些方法,如下所示。然後在StoryBoard中將NavigationController的root的class設為新建的UINavigationController的子類。

// 支援的裝置方向
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{
    if ([self.topViewController isKindOfClass:[XxxXxxXxx class]]) {
	return UIDeviceOrietationMaskXxx;
    } else {
	return UIDeviceOrietationMaskXxx;
    }
} 
 
// 是否支援自動旋轉
- (BOOL)shouldAutorotate 
{ 
    if ([self.topViewController isKindOfClass:[XxxXxxXxx class]]) {
	return YES; 
    }
    return NO; 
} 

// 支援的介面方向 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
}