2009-09-27 34 views
7

我有三個ViewController設置爲處理三個視圖。我遇到的問題是在模擬器中的方向是LandscapeRight(這是我想要的),並且第一個視圖在該橫向視圖中正確顯示,但是當我轉到第二個和第三個視圖時,它們顯示出來將手機屏幕左下角的視圖左上角逆時針旋轉90度。我一直在試圖調試這幾天和我已經得到了一個線索最近正在跟蹤它通過以下方式:只有第一個UIView添加視圖addSubview顯示正確的方向

以下是我的應用程序委託的applicationDidFinishLaunching:

NSLog(@"1"); 
[window addSubview:welcomeController.view]; 
NSLog(@"2"); 
[window addSubview:goalController.view]; 
NSLog(@"3"); 
[window addSubview:planningController.view]; 
NSLog(@"4"); 

[window bringSubviewToFront:welcomeController.view]; 
NSLog(@"5"); 

我的每ViewControllers實現類似於下面的東西(傳遞給NSLog的字符串中是控制器的名字唯一的變化切換出):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Return YES for supported orientations 
NSLog(@"called for WelcomeController"); 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

就這樣,我得到的控制檯輸出如下:

a 
called for WelcomeController 
called for WelcomeController 
called for WelcomeController 
called for WelcomeController 
2 
called for GoalController 
3 
called for PlanningController 
4 
5 

我覺得有趣的是,shouldAutorotateToInterfaceOrientation被稱爲4次爲第一個視圖添加,而另外兩個只被調用一次。我期望這可能是因爲它首先要做一些設置(我相信模擬器是以縱向模式開始的,所以它可能會在旋轉時調用它),但我發現相關性有點可疑。

我已經切換了順序,因此首先爲goalController和welcomeController調用addSubview。在這種情況下,它是以正確的橫向方向顯示的goalController(通常是歡迎控制器)。這似乎消除了我的XIB文件和ViewControllers本身。我不知道爲什麼addSubview被調用的第一個視圖是特殊的。我也嘗試在索引0處使用insertSubview,結果相同。

回答

0

我有一個similar issue。不知道爲什麼。但是,解決方法是在第一個視圖之後的每個視圖上調用此方法:

[planningController.view setFrame:CGRectMake(0,0,480,300)];

和-addView之前。我很好奇,如果這能幫助你。如果我不是唯一有這個問題和解決方法的人,那麼也許有一個原因。

+0

這似乎沒有幫助我的代碼。我曾嘗試在相應的addSubview調用前後對goalController和planningController進行調用(我甚至嘗試切換300和480;)它似乎在某些點上有所不同,因爲在部分背景中使用了歡迎視圖屏幕沒有被覆蓋,它只是白色,所以我認爲它必須在屏幕上伸展。 – 2009-09-28 12:21:01

+0

我從你的文章中注意到的一件事是,你似乎有一個以縱向模式顯示的桌面視圖,將右側的大約1/3頁面留空。我得到的是同樣的東西,除了我的視角旋轉了90度,所以應該是最上面的是向左。 – 2009-09-28 12:26:02

+0

我用橫向設計設計了IB中的所有東西,這可能是爲什麼東西指向正確的方向,但不佔用整個屏幕。我開始使用mainWindow,viewControllers和views,都處於風景中。 像你一樣,如果我改變我的視圖控制器的順序,那麼以先到者爲準,不需要setFrame調用。 – mahboudz 2009-09-28 19:10:42

4

出現同樣的問題,顯然將子視圖添加到UIWindow不符合我的預期。我添加了一個「虛擬」UIViewController,這是UIWindow中唯一的子視圖,我設法解決了這個問題。在添加完一個之後,它完美地將多個子視圖添加到虛擬控制器,所有這些都以正確的方向進行。

所以「虛擬」控制器類中唯一的代碼是「shouldAutorotateToInterfaceOrientation」函數。這也應該與所有其他子視圖中的相同功能相匹配。

希望它有幫助。

+1

這不適用於我(在iPad上)。 我不是noobsor,但這是非常令人沮喪的。 – tobyc 2010-04-22 07:31:37

+0

不適用於我也... – Karthik 2013-04-20 11:00:44

0

這遠非理想。但是你可以破解第二個視圖轉換,以便正確旋轉。這適用於我,因爲我的應用程序只有橫向模式。如果你想改變方向,它可能並不理想。

[window addSubview:firstController.view]; 
[window addSubview:secondController.view]; 
CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI/2.0); 
[backgroundViewController.view setTransform:rotate]; 
CGRect contentRect = CGRectMake(0, 0, 1024, 768); 
backgroundViewController.view.bounds = contentRect; 
[backgroundViewController.view setCenter:CGPointMake(768/2, 1024/2)]; 

0

我想我有一個解決方案,似乎工作。添加一個視圖,然後立即刪除它,重複每個視圖,然後添加所有三個。像這樣:

[window addSubview:welcomeController.view]; 
[welcomeController.view removeFromSuperview]; 
[window addSubview:goalController.view]; 
[goalController.view removeFromSuperview]; 
[window addSubview:planningController.view]; 
[planningController.view removeFromSuperview]; 

[window addSubview:welcomeController.view]; 
[window addSubview:goalController.view]; 
[window addSubview:planningController.view]; 

它似乎工作,至少在模擬器。

+0

這適用於我在iPad 4.2模擬器上,但不適用於3.2(我不幸仍然需要支持)。 – 2011-01-18 19:49:47