2013-01-04 74 views
5

在我的通用應用程序中,我需要處理iphone和ipad的不同方向。對於iPad我需要允許橫向方向和iphone肖像。我首先回到了下面的代碼通用應用程序中的IOS 6方向問題

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
     return UIInterfaceOrientationIsPortrait(interfaceOrientation); 

    return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
} 

在IOS 5中工作正常但是在IOS 6自動旋轉方法並沒有被解僱。從那以後,我已經改變了方法,

-(BOOL)shouldAutorotate 
{ 
    return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAll; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

即使這個方法不是在IOS在所有發射6

我的plist設置

enter image description here

我需要同時處理爲iOS 5和IOS 6定位[iPhone-portrait,iPad-landscape]。請指導我解決此問題。

+0

請參閱所以我的答案是http:// stackoverflow。com/questions/12933089/i-want-to-make-my-appliaction-only-in-landscape-orientation-in-ios-both-ios-5-a – Deepesh

+0

除了接受的答案,'preferredInterfaceOrientationForPresentation'要求一個方向,你正在返回一個掩碼('UIInterfaceOrientationMaskPortrait')而不是例如'UIInterfaceOrientationPortrait'。 – Jesper

回答

3

你的rootviewcontroller是UINavigation控制器還是UITabbarcontroller? 如果是這樣,如果您在視圖控制器中調用這些方法,這些方法將無法正常工作。

因此,在這些容器視圖控制器上創建一個目標C類並添加到您的項目中。

@implementation UINavigationController (autorotate) 


-(NSUInteger)supportedInterfaceOrientations 
{ 
    //make the check for iphone/ipad here 

if(IPHONE) 
    { 
return UIInterfaceOrientationMaskPortrait; 
    } 
else 
    { 
return UIInterfaceOrientationMaskLandscape; 
    } 

} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
return UIInterfaceOrientationPortrait; 
} 

- (BOOL)shouldAutorotate 
{ 
return NO; 
} 
0

你想要的是以下幾點:

#pragma mark - iOS 5.1 and under Rotation Methods 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; { 
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ 
    return UIInterfaceOrientationIsPortrait(interfaceOrientation); 
    } 
    else{ 
    return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
    } 
} 

#pragma mark - iOS 6.0 and up Rotation Methods 

- (BOOL)shouldAutorotate; { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations; { 
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ 
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); 
    } 
    else{ 
    return UIInterfaceOrientationMaskLandscape; 
    } 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation; { 
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ 
    return UIInterfaceOrientationPortrait; 
    } 
    else{ 
    return UIInterfaceOrientationLandscapeLeft; 
    } 
} 

你有什麼要確保的是2倍

首先,這是你RootViewController實現。如果您將UIViewController的嵌入在UINavigationController(或UITabBarController)內,則必須自定義UINavigationController(或自定義UITabBarController)類來實現這些方法並使用它。

第二個,您必須確保您擁有您在Info.plist文件中支持的方向。否則,系統將覆蓋這些方法的返回值(注:您也可以通過單擊目標摘要頁面中的按鈕輕鬆更改這些值)。

希望有助於!

2

這個方法添加到應用程序委託其100%的工作

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window // iOS 6 autorotation fix 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     return UIInterfaceOrientationPortraitUpsideDown; 
    } 
    else 
     return UIInterfaceOrientationMaskAll; 
} 
+0

簡單而完美! –

0

這裏的普拉迪普的回答迅速版本。你並不需要所有子類的導航控制器來得到你想要的工作(也就是,關閉橫向的iPhone只)

只需添加到您的應用程序代理:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int { 
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone { 
     return Int(UIInterfaceOrientationMask.Portrait.rawValue) 
    } else { 
     return Int(UIInterfaceOrientationMask.All.rawValue) 
    } 
}