2010-10-19 267 views
8

這僅僅是一個測試應用程序,只有一個AppDelegate類來創建我所做的就是創建一個基於Windows的應用程序,設置支撐取向只在景觀中的info.plist ,然後添加以下代碼:高度和寬度

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft]; 

// Override point for customization after application launch. 
UIAlertView *test = [[UIAlertView alloc] initWithTitle:@"hu" message:@"hui" delegate:nil cancelButtonTitle:@"hi" otherButtonTitles:nil]; 
[test show]; 
[window makeKeyAndVisible]; 
    NSLog(@"win %f - %f", window.bounds.size.width, window.bounds.size.height); 
return YES; 
} 

沒有第一線,設置狀態欄定位,警報視圖顯示在肖像,即使接口的其餘部分是景觀左側。

反正日誌仍然給出了這樣:

win 768.000000 - 1024.000000 

這是南轅北轍(因此當我在實際的應用中添加子視圖框架是不正確的)

蘋果似乎真有因爲我沒有任何東西,只有問題,我不記得iPhone上發生過這種情況,所以請有人告訴我如何解決這個問題。

我給500的聲譽(這是我的名譽的所有,但10)誰至少可以解釋爲什麼發生這種情況,希望提供解決方案的人。

+0

您使用的是哪個SDK版本? – ImHuntingWabbits 2010-10-28 07:44:56

+0

你爲什麼在AppDelegate中這樣做?爲了解決這個問題,我在AppDelegate中創建了一個BOOL,這個BOOL是False,直到該方法被調用的地方變爲TRUE。然後在我的MainVC中的viewWillLoad中,我啓動一個計時器來檢查AppDelegate BOOL是否爲TRUE。如果是我開啓顯示警報的方法。爲了使它看起來更好看,我還在MainVC上顯示Default圖像,直到出現消息。這可能看起來很不方便,但我並不總是必須顯示警報視圖,所以我也檢查了這一點。 – 2010-10-28 09:36:05

回答

17

我覺得iOS Application Programming Guide"Launching in Landscape Mode"主要解釋了什麼是與你的測試程序發生的事情:

應用程序在iOS中通常 肖像模式下啓動,以匹配主屏幕的方向 。如果你有一個在縱向 和橫向模式下運行的應用程序 ,您的應用程序 應該總是在縱向模式下 推出初期,然後讓其觀點 控制器作爲 需要根據設備的 方向旋轉​​的接口。如果您的應用程序運行在橫向模式下 只,但是,你必須 執行以下步驟來 使其在景觀 方向最初推出:

  • 在應用程序的Info.plist文件, 添加UIInterfaceOrientation鍵和 將其值設置爲橫向模式。 對於風景方位,您可以將 的值設置爲 UIInterfaceOrientationLandscapeLeft或 UIInterfaceOrientationLandscapeRight。

  • 在橫向模式下佈置您的視圖 並確保它們的自動確認 選項設置正確。

  • 覆蓋您的視圖控制器的 shouldAutorotateToInterfaceOrientation: 方法並返回只爲 所需的橫向和NO 肖像取向YES。

重要:前面的步驟假定 您的應用程序使用視圖控制器 來管理它的視圖層次。查看 控制器提供了一個重要的 數量的基礎設施,用於處理 方向更改以及其他 複雜的與視圖相關的事件。如果 應用程序未使用視圖 控制器-如可以是具有 遊戲和其他基於ES-的OpenGL 的情況下的應用程序,你負責 旋轉紙面(或 調整繪圖命令)來呈現需要作爲 您在 風景模式下的內容。

就測試應用而言,關鍵部分是最後一部分。您沒有視圖控制器,因此您完全有責任以您想要的方向設置UI。這就是爲什麼你必須手動設置狀態欄的方向。

我讀了第一段話,說iOS應用程序總是以縱向模式啓動,然後根視圖控制器旋轉其視圖以便立即與設備方向匹配,並且一旦將其添加到窗口中就不會動畫。這意味着UIWindow本身不會旋轉,因此其尺寸將始終以縱向(如tadej5553所述)表示。此外,所有UIWindow子視圖的框架也將按照縱向(因爲框架始終在父視圖的座標中定義)。因此,無論您如何旋轉設備,根視圖控制器的框架始終都是以縱向定位的。但是,由於視圖的邊界屬性是根據其自己的座標定義的,因此該高度和寬度應反映視圖的當前方向。

目前尚不清楚你試圖用你的真實應用完成什麼,但推薦的做法是爲縱向定位你的視圖,然後設置他們的autoresizing屬性來處理自動旋轉(無論它發生在應用程序之後啓動或更高版本)。

+0

真的很好的答案,所以我會接受它,並開始另一個賞金(不是500,儘管:\\),當我可以和獎勵給你,但個人而言,我更喜歡德尼茲的答案,所以他得到賞金。你很好地解釋了爲什麼它會發生在一般情況下,這對我來說真的很有用,如果我現在可以分裂獎金的話。 – 2010-10-29 08:17:19

+0

iPad是規則的例外,因爲它的主屏幕可以旋轉到橫向。 – bentford 2010-11-01 18:25:53

3

而不是手動搞亂狀態欄,嘗試在您的info.plist文件中設置UISupportedInterfaceOrientationsUIInterfaceOrientationLandscapeLeft。然後,應用程序應該在啓動後立即啓動。

手動設置狀態欄取向是一種「低水平」的。您的視圖控制器還需要在shouldAutorotateToInterfaceOrientation實例方法中返回UIInterfaceOrientationLandscapeLeft

+0

請重新閱讀我的問題:)你會認爲你的建議會起作用,但事實並非如此。 – 2010-10-19 19:56:02

+0

對此表示抱歉 – Nimrod 2010-10-19 19:57:35

+0

爲什麼你沒有任何UIViews?就我所知,您總是應該在窗口中放置一個容器UIView。你不是直接在窗口內部放置窗口小部件視圖,或者你是什麼? – Nimrod 2010-10-19 19:59:27

4

窗口將永遠給的縱向尺寸。總是。

但在它的意見,會給出正確的測量(關於方位),所以一定要使用這些。

+0

我只是這樣做了,它正確地更改狀態欄差異(20像素),但它仍然不會切換寬度和高度。 – 2010-10-19 20:22:03

+0

橫向仍然像橫向768(橫向屏幕的高度是1024),反之亦然縱向 – 2010-10-19 20:28:04

+0

使用界限,而不是視圖的框架來獲得正確的座標 – tadejsv 2010-10-22 15:34:57

10

的UIWindow不知道什麼旋轉。旋轉方法封裝在UIViewController中。 (自動旋轉等)

UIAlertView使用UIApplication的statusBarOrientation屬性來選擇警報的方向。

// Rotate to a specific orientation. This only rotates the status bar and updates the statusBarOrientation property. 
// This does not change automatically if the device changes orientation. 
@property(nonatomic) UIInterfaceOrientation statusBarOrientation; 

正如您從SDK頭看到的那樣,statusBarOrientation不會自動更改。所以無論你還是UIViewController(自動旋轉)都應該改變這個屬性。

如果你開始的畫像(這是一個UIWindow的默認方向一致),並使用shouldAutorotateToInterfaceOrientation,讓UIViewController中來處理旋轉,它改變的UIApplication的statusBarOrientation上的每個設備的方向變化。

但是,如果您以橫向模式啓動,則應該手動將statusBarOrientation設置爲一次。

希望這會有所幫助。

+1

感謝您解釋它的條款UIAlertView並說我該做什麼。 – 2010-10-29 08:21:56

+0

我找了這個解決方案之前花了很長時間試圖解決這個問題。放置[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];作爲我的loadView的第一行完成了這項工作。謝謝! – Andy 2012-01-25 11:05:50

+0

我想我只是失去了2小時試圖讓我的iPad應用程序(iOS5)只在橫向啓動。這工作,非常感謝。 – Jasper 2013-03-06 09:51:15

3

這裏的邊界是什麼,我獲得這項工作:

  • 在Info.plist中,確保有這些參數:
    • 初始界面方向=風景(右側主頁按鈕)
    • 支持的接口方向
      • 項目0 =風景(右home鍵)
      • 項目1 =景觀(左home鍵)
  • 添加基於廈門國際銀行視圖控制器,用它)一個觀點,即自動調整大小(消除調整大小的問題,等等。
    • 注意我在這裏使用了一個視圖控制器的導航控制器,因爲這是我的方便,但我認爲這也適用於單個VC。

添加的代碼一點點到應用程序委託:

_rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
_navigationController = [[UINavigationController alloc] initWithRootViewController:self.launcherViewController]; 
[window addSubview:self.navigationController.view]; //I think this is the key. 
[window makeKeyAndVisible]; 

我覺得關鍵是看,我試了一下,沒有它,並在iPhone上它的工作就好了,在iPad上儘管如您所說,警報以縱向模式顯示。當我根據需要添加查看以橫向模式顯示的提示時。

0

我什麼也沒有,但硬編碼我的應用程序只出現景觀模式的問題。大部分時間沒有視覺問題,但最低20像素的按鈕無法被選中。我在我的主UIWindow上做了一個clipToBounds,並在其圖層上添加了一個邊框,我可以看到UIWindow在狀態欄下。我試圖改變我的UIWindow的X偏移量爲20(UIWindow仍然在肖像,其內容是風景),但這意味着我的UIControllers下移20像素(不知道爲什麼)。雖然這對你來說是一個不同的問題,但我也發現了同樣的問題,因爲打印時的邊界和框架似乎是正確的。

反正削減長話短說我改變了我的plist從UIInterfaceOrientationLandscapeLeft到UIInterfaceOrientationLandscapeRight,也改變了我的UIViewController方法:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

和我所有的問題就走了。很多時候,我發誓蘋果旋轉代碼中存在一些錯誤,這些錯誤最終會成爲我實現某些東西的方式,但我認爲這個代碼只是一個Apple的代碼。

讓我知道這是否解決了您的問題