2013-08-22 94 views
32

我試圖在iOS 7中測試我的應用程序,然後我發現我的視圖顯示在狀態欄上......當我閱讀iOS 7時,狀態欄是隱藏的。那麼如何讓它兼容在iOS 6和iOS 7上運行?我是否應該爲每個屏幕爲不同的iOS版本創建不同的.xib文件?狀態欄顯示在我的視圖的邊界上iOS 7

我一直在閱讀這個: 如果標準應用的兩個版本應該有相似的佈局,使用自動佈局來創建一個在兩個版本的iOS中都能正常工作的UI。要支持iOS的多個版本,請指定Auto Layout可用於調整故事板或XIB文件中的視圖和控件的一組約束(要了解有關約束的更多信息,請參閱「約束之間的快照視圖之間的關係」)。

如果標準應用程序的兩個版本應具有相似的佈局,並且未使用自動佈局,請使用偏移量。要使用偏移量,請首先更新iOS 7的UI。接下來,指定將早期UI中每個元素的原點,高度和寬度定義爲iOS 7 UI中元素新位置的偏移量的值。

但是,當我的.xib使用自動佈局,它顯示了一個錯誤,自動佈局是在以前的版本到iOS 6

我該如何解決這個問題?

+2

你應該問蘋果開發者論壇ios7相關的問題,因爲它仍然是在NDA。 – cahn

+0

看到這個鏈接:http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7 – Developer

+0

@開發我已經通過這個鏈接..它將狀態酒吧在淺灰色的顏色..但我的問題是設置我的UI屏幕框架...因爲我的整個屏幕20像素了...在ios7中,但在ios6中正常... – Bhrigesh

回答

9

我有同樣的問題。現在我做了兩個黑客並決定與我會去:

  • 您可以通過設置UIStatusBarHiddenUIViewControllerBasedStatusBarAppearance到真正完全隱藏狀態欄。
  • 在我的應用程序,我創建了值爲0的頂部間隔限制,我programmaticaly將其更改爲20,如果我檢測到應用程序是iOS上的7

運行如何使自動佈局佔了狀態欄區?


嗯,我想通了。

在您的子視圖(BRSMyListSubViewController在我的情況),在viewDidLoad,你需要設置這兩個

self.edgesForExtendedLayout = UIRectEdgeNone; 
self.automaticallyAdjustsScrollViewInsets = NO; 

OR

self.edgesForExtendedLayout = UIRectEdgeNone; 
self.extendedLayoutIncludesOpaqueBars = YES; 

一個非常有趣的是,在根視圖控制器,這些值分別設置爲默認UIRectEdgeAllNOYES,但其tableView不在導航欄和頁腳下。

我不知道爲什麼它是如此不合邏輯。

奇怪的是,edgesForExtendedLayout必須與其他兩個屬性中的一個混合在一起,即使它明確地對行爲負責。

37

iOS 7顯然支持隱藏某些視圖但不是其他視圖的狀態欄。要隱藏所有視圖,請執行以下操作:

  1. 確保Hide during application launch仍被選中,以支持以前的操作系統版本。
  2. 在您的Info.plist文件中,添加View controller-based status bar appearance並將其設置爲NO
  3. 您可能需要在構建之前「清潔」(我做過),但是您的應用應該像以前一樣工作:沒有狀態欄懸在您的視圖上!
+4

這工作對我來說除了狀態欄在顯示UIImagePicker後重新出現。 – Swindler

+1

嗯,在這裏找到圖像選擇器問題的答案:http://stackoverflow.com/a/18747724/455794 – Swindler

+2

這似乎完全隱藏了我不想做的狀態欄。理想情況下,我只想將我的內容向下移動,以便狀態欄不會懸停在其上並重疊我的應用程序標題。僅供參考我正在製作phonegap/cordova應用程序。 – njtman

24

您可能需要在每個視圖控制器上添加以下代碼。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) 
    { 
     [self prefersStatusBarHidden]; 
     [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; 
    } 
    else 
    { 
     // iOS 6 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; 
    } 
} 

// Add this method 
- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 
+1

+1正在工作。 –

+1

只需添加prefersStatusBarHidden方法就足夠了。 – SG1

+1

@ SG1 preferesStatusBarHidden只適用於ios7,所以我認爲你希望你的應用程序能夠在iOS 6上工作,直到全世界有ios7的設備;-) – NIKHIL

3

沒有必要構建multi-xib。我認爲你的問題是「20px」:同一個XIB文件在iOS中看起來很好  6,但它在iOS中丟失了20個像素  7.

例如,你有一個視圖,它的Y = 0。 iOS   6,它位於狀態欄的底部。在iOS   7中,它顯示在狀態欄上。

您應該使用Xcode 5打開您的XIB文件並啓用助手編輯器。請按照下列步驟:

  1. 選擇文件檢查器和開關 「查看方式」 到 「的iOS 7和後來的」

  2. 選擇尺寸檢查,並與 「-20」

  3. 填補移動deltaY完成!

+2

這聽起來像它應該工作,但我不能得到它在我的iPhone 5 w/iOS 7 GM上工作,使用Xcode 5 GM構建應用程序。您的解決方案似乎沒有效果。我也試着清理這個項目。 – njtman

+0

這樣做的訣竅:)但你必須在xib的每個視圖/子視圖中設置。 –

+0

在相關條目上有一些代碼的答案。 @Stunner stackoverflow.com/a/18976660/235206有解決方案 – MiKL

0

你只有一次需要檢查你的主要UIView的尺寸適用於iOS 7.0 &後&的iOS 6.0 &下,很可能你會得到的想法。

從iOS的7蘋果改變主視圖大小=固定的,如果你添加導航欄,你的TabBar視圖大小保持相同[iPhone 4S:320 * 480,iPhone 5:320 * 568]這意味着什麼。

8

如果您想在iOS   7下使用Xcode 5顯示狀態欄,只需重新排列按鈕和其他子視圖以在狀態欄周圍留出足夠的空間即可。但是,等一下!我也喜歡支持iOS   6。我怎麼做?

我發現documentation from Apple,發現文檔中的「支持一個標準的應用程序的兩個版本」稱號。

如果您正在編輯XIB file,選擇它並點擊助理編輯。您將能夠在那裏找到「手動,自動...」菜單。然後選擇「預覽」。

Enter image description here

那麼你會發現並排視圖佈局的一面。然後您會注意到右側窗格右側底部有一個彈出按鈕(視圖);它說「iOS   7及更高版本」。您可以選擇「iOS   6.1及更早版本」。 WOA!現在,您可以爲iOS 6.1  調整,而不影響的iOS  佈局7

Enter image description here

如果你在故事板的工作,它基本上是相同的。您選擇一個視圖控制器對象,然後單擊助理編輯器模式,選擇「預覽」,然後選擇「iOS7和更高版本」... Bluh Bluh Bluh。

我不確定,但只有助理編輯能夠切換到iOS   7 +/iOS   6-模式。我剛剛發現這個,所以請指出,如果有任何誤解或其他技巧。

+3

「現在,您可以在不影響iOS 7佈局的情況下對iOS 6.1進行調整」。我不認爲這是真的。這只是一個預覽工具。 –

+0

「iOS 7及更高版本」的選項也可以在View Controller的「文件檢查器」中查找故事板 – RootCode