2012-03-14 57 views
0

我已經創建了UITabBarController的子類來處理視圖的autoRotation,因爲我需要一些視圖來切換肖像和其他景觀。UITabBarController在切換視圖時強制旋轉

如果我旋轉設備,這一切都按預期工作,所以風景的將旋轉到風景,並保持這種方式。我遇到的問題是,視圖顯示時輪播不會自動執行。因此,意圖爲風景的視圖將顯示爲肖像,直到設備旋轉到風景,此時它們會將其鎖定到風景模式。

我想知道是否有人可以告訴我如何強制旋轉視圖更改,所以當我切換到橫向視圖時,它會立即旋轉到該方向?

對不起,如果這已被問過一百萬次,但我似乎無法找到線程。

編輯,我發現下面的代碼:

UIViewController *c = [[UIViewController alloc]init]; 
[self presentModalViewController:c animated:NO]; 
[self dismissModalViewControllerAnimated:NO]; 
[c release]; 

這並進行旋轉,但我不知道在哪裏把它作爲標籤欄控制器不叫東西,如init/viewDidLoad,顯然把它放在viewDidAppear等會導致無限循環。

對此有任何幫助嗎?

回答

3

我想出了一個解決方案,我的問題,並將它發佈在這裏,只要incase其他人想要它。我現在警告你這是一個解決辦法,但我找不到答案,所以這是我能做的最好的。

首先添加UITabBarControllerDelegate到您的協議中,正在創建TabBarController,我使用的AppDelegate所以做到以下幾點:

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate> 

這允許訪問以下的TabBar協議:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

只要按下TabBarItems(底部的按鈕),就會調用它。在這個函數中,我提取了viewControllerNibFile的名稱,因爲這是它們的名稱(如果您不想擔心命名約定,您可以使用view.tag),並將事件發佈到通知中心,如下所示:

NSString *notificationName; 

if ([viewController.nibName isEqualToString:@"IntroViewController"]) 
    notificationName = [NSString stringWithString:@"IntroViewChange"]; 

NSLog(@"%@", notificationName); 
[[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil]; 

然後我設置在調用下面的事件類的監聽:

- (void)updateViewRotation 
{ 
    UIViewController *c = [[UIViewController alloc]init]; 
    [self presentModalViewController:c animated:NO]; 
    [self dismissModalViewControllerAnimated:NO]; 
    [c release]; 
} 

就像之前提到的,這是一個巨大的變通,這是相當有分量的和醜陋來看待,但它確實我需要的。如果有人想提供更高效的代碼,我會樂於接受。

+0

雖然有更簡單的方式來實現這一點沒有發佈進一步的通知,該'updateViewRotation'是輝煌的。 – SwiftArchitect 2015-09-04 03:58:57

+0

這是行得通的,但由於快速顯示視圖控制器C,它會創建一個奇怪的屏幕閃光。 – 2015-11-24 11:32:25

2

@Elliott,我給了你一個答案,因爲它比我嘗試過的任何其他解決方案都更好,但這裏是一個簡化。而不是使用的通知,只是把這個在didSelectViewController:

if ([viewController respondsToSelector:@selector(updateViewRotation)]) { 
    [viewController performSelector:@selector(updateViewRotation)]; 
} 

這隻能如果需要的viewController該特別注意的是標籤上的第一個。

此外,對於更新的iOS 6棄用:

- (void)updateViewRotation 
{ 
    UIViewController *vc = [[UIViewController alloc] init]; 
    [self presentViewController:vc animated:NO completion:nil]; 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 
+0

感謝您的更新,我將在這裏留下您的代碼,而不是更新我的(除非人們添加更多更新,在這種情況下,我會連接它們)。很高興幫助某人,但不是理想的解決方案! – 2013-03-06 13:16:54