2012-09-24 208 views
5

我知道你必須使用IOS6的新旋轉方法,但似乎我寫的方法不起作用。IOS6旋轉問題

我設置好的我的plist文件,允許所有旋轉,但不portraitUpsideDown

然後我在我的的appDelegate如下:

self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 
[self.window setRootViewController:navController]; //add nav controller to be the root view 

然後在我的rootView,推到另一個控制器,我有:

WebViewViewController *webController = [[JBWebViewViewController alloc] init]; 
webController.urlString = urlName; 
[self.navigationController pushViewController:webController animated:YES]; 

而在網絡控制器我哈哈五個:

#pragma mark - System Rotation Methods 
//for any version before 6.0 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
//only allow landscape 
return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

/for 6.0+ 
- (BOOL)shouldAutorotate{ 
return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
return UIInterfaceOrientationMaskPortrait; 
} 

我想要做的,是讓根視圖3度旋轉,但是當切換到Web視圖(注意我做俯臥撐的導航,而不是增加子視圖),我只想讓縱向視圖。

有人幫我請

------- UPDATE ----------

我創建的UINavigationController我自己navController子類中,我有一個BOOL landscapeModeOn那我可以設置要告訴自動旋轉功能

#pragma mark - System Rotation Methods 
//for any version before 6.0 
- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)interfaceOrientation 
{ 
    if (landscapeModeOn) { 
    return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; 
    } else { 
    return interfaceOrientation == UIInterfaceOrientationPortrait; 
    } 
} 

//for 6.0+ 
- (NSUInteger)supportedInterfaceOrientations{ 
    if (landscapeModeOn) { 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
    } else { 
    return UIInterfaceOrientationMaskPortrait; 
    } 
} 

- (BOOL)shouldAutorotate{ 
    UIInterfaceOrientation ori = [UIDevice currentDevice].orientation; 
    if (landscapeModeOn) { 
    return ori != UIInterfaceOrientationPortraitUpsideDown; 
    } else { 
    return ori == UIInterfaceOrientationPortrait; 
    } 
} 

IN子視圖加載,我做的:

- (void)viewWillAppear:(BOOL)animated{ 
    //get nav controller and turn off landscape mode 
    JBNavController *navController = (JBNavController*)self.navigationController; 
    [navController setLandscapeModeOn:NO]; 
    [navController shouldAutorotate]; 
} 

--------------------請參閱最佳答案的報價 對於IOS6,蘋果現在專注於將Storyboard的AutoLayout與新的旋轉定義一起使用,因此很難修復基礎上的iOS 4.3和iOS 5的編碼結構

從applefreak爲iOS6的一些微小的錯誤,他的建議暗示的:

你的情況的一個主要挑戰是不處理的方向。其實它的鎖定不同的視圖控制器,以特定的方向

雖然手動旋轉的觀點似乎真的很難,沒有任何錯誤的事,但現在看來,我想唯一的解決辦法,將發佈更多一旦解決

+0

根據rooster117的答案通用的代碼,這是我的解決方案:http://stackoverflow.com/questions/12662240/how-to-make-app-fully-工薪正確地換自轉式-IOS-6/12662433#12662433] [1] [1]:http://stackoverflow.com/questions/12662240/how-to-make-app - 完全性工作,正確地換自轉功能於IOS-12662433分之6#12662433 – Carina

回答

2

下面的代碼是錯誤的!

- (BOOL)shouldAutorotate{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

請記住,只有當shouldAutoRotate返回YES時,supportedInterfaceOrientations纔會被調用。現在,根視圖控制器決定它是否是兒童旋轉或不旋轉。

在你的情況我建議有一個基類控制器,您self.viewController並設置self.viewController到根視圖控制器不navigationController否則旋轉方法將不會被調用!我遇到了同樣的問題。您應該與基本視圖控制器建立HAS-A關係,並且它是子級。 ShouldAutoRotate基於活動的孩子返回Yes/No,支持方向相同。如果你遵循這個架構,那麼對於複雜的應用程序來說,它是一致的

例如,你的情況應該BaseviewController從是從shouldAutoRotate支撐定向委託返回,返回時UIInterfaceOrientationPortrait是webviewController活躍。我希望這是有道理的。

+0

歡呼,但它決策意識。但是,它似乎完全不影響結果,我仍然可以旋轉到橫向模式。 – phil88530

+0

它不應該你可以把NSLog放在shouldAutoRotate中,看看它是否被調用!我有同樣的問題,以前的編碼器使用UINavigationController。我不得不將其更改爲我的CustomViewController作爲根視圖控制器和方法開始調用,旋轉開始按預期工作。我只支持肖像模式,但只有一些屏幕在景觀模式下旋轉。 – applefreak

+0

我做了我自己的navController類,並且對於每個視圖,我根據是否僅需要視圖肖像來設置導航控制器。有用。但是,當我第一次加載視圖時,它不檢查它。我手動調用[navController shouldAutoRotate [當視圖加載,並且我NSLog它,它被調用,但視圖不旋轉(例如根視圖橫向進入第二個僅肖像視圖,視圖在橫向旋轉,並不旋轉,但如果我將它畫像,它會旋轉回來,然後如果我再次將其橫向放置,它將不會旋轉) – phil88530

6

對於你將不得不繼承你的NavigationController的子類並添加shouldAutorotate和supportedInterfaceOrientations方法。 iOS6現在要求您的導航堆棧以與iOS5相反的順序,因此它會首先詢問您的NavigationController,如果返回YES,它甚至不會諮詢它的子視圖控制器。爲了解決這個問題,你必須添加邏輯自己做這個

所以在您的子類的導航控制器手動問你的當前視圖 - 控制它的自轉能力:

- (BOOL)shouldAutorotate 
{ 
    return self.topViewController.shouldAutorotate; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return self.topViewController.supportedInterfaceOrientations; 
} 

,並在您的個人viewcontrollers你現在可以實現的函數並讓它們返回您在問題中定義的值。

我希望這是有道理的。

+0

嘿:我有我的webViewController:UINavigationController的,並已實現你的方法,但是當我點擊按鈕,RU n:self.navigationController pushViewController:webViewController,它(lldb)並死亡 – phil88530

+0

我會確保你的子類的所有實現都是正確的。如果您使用IB,請確保導航控制器是正確的類,如果您手動分配它,請確保您在alloc中使用了所有正確的關鍵字。我會認爲它有什麼問題。如果沒有,你會得到任何幫助輸出? – rooster117

+0

如果你回到我的問題,我在的appDelegate導航控制器ALLOC,然後只需在根視圖navigationController推,這是所有的地方,我受夠了。你覺得我會做一些修改嗎?我只得到了(LLDB),無其他錯誤消息 – phil88530

0

它的iOS5和iOS6的

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    { 
     // here to implement landscope code 
    } 

    else 
    { 
     // here to implement setframePortrait 
    } 
} 
+0

他使用替代(bool)autorotateToInterfaceOrientation,它在iOS6中被棄用 – Comradsky