2013-09-23 128 views
90

更新到Xcode 5後,我所有應用程序視圖中的導航欄都向下移動。這裏有一些截圖,第一個顯示視圖中的所有內容,第二個顯示所有內容未觸及。搜索欄應該從導航欄的位置開始。如何防止UINavigationBar覆蓋iOS 7中的視圖頂部?

All Content All Content on Idle

任何人都知道我是如何解決這個問題?

編輯:我曾嘗試這種以前的建議:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) 
     self.edgesForExtendedLayout = UIRectEdgeNone; 

但它的產量非常奇怪的結果。

Solution Attempt

這可能是因爲我有一個出現由於導航欄的透明度此視圖控制器下一個「幻燈片菜單」。

回答

220

設置導航欄的透光性爲NO

self.navigationController.navigationBar.translucent = NO; 

這將修復從導航欄和狀態欄的下面被陷害的觀點。

如果你有顯示和隱藏的導航欄,然後在您的viewDidLoad方法使用

if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) 
    self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific 

+1

我已將此放在'viewDidLoad'下,但它不會產生任何更改。 –

+13

使它在viewDidLayoutSubviews功能 – Hindu

+1

追加此viewDidLayoutSubviews做了詭計。我感謝幫助先生們! –

26

iOS 7通過默認所有控制器半透明的屬性值是YES,那麼你設置透光性NO此問題。

self.navController.navigationBar.translucent = NO; 
+2

沒有「navController」屬性。使用這個:self.navigationController.navigationBar.translucent = NO; –

+0

我在應用程序委託中創建navigtionbarcontroller對象並給出名稱navController。 –

-3

另一種選擇是打開你的Info.plist文件中的源代碼模式,並輸入以下信息:

<key>UIViewControllerBasedStatusBarAppearance</key> 
<false/> 
<key>UIStatusBarHidden</key> 
<true/> 

希望這有助於。

+1

我不認爲這會影響視圖。 –

3

您可以添加這個方法到您的視圖控制器上這URL如圖所示:

-(void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height); 
} 
7

如果你想保持你的navigationBar半透明,在你viewDidLoad結束或在您的viewWillAppear加入這一行代碼:

[self.view sendSubviewToBack:self.tableView] 

不知怎的,如果你的scrollView子類(UITableViewUICollectionView,等等)是在index 0在當前的VIE w subviews,它會根據您的navigationBar自動調整插頁。在iOS7之前的版本中,它不應該影響你的用戶界面。


編輯 如果初始化UITableView編程,那麼最好使用此[self.view insertSubview:self.tableView atIndex:0];

+0

這應該是正確的答案。如果以編程方式添加子視圖,則只需執行'[self.view insertSubview:self.tableView atIndex:0];'而不是在添加後將其發送回。 – smitt04

+0

正確。但是,如果不知道他是如何啓動他的控制器的(以編程方式,界面構建器),我們不能認爲這是最好的解決方案。雖然我已經編輯了我的答案。 – jbouaziz

+0

這工作,但看起來像一個黑客。官方文檔中是否有任何關於此的通知? –

2

另一種方法是設置您的視圖控制器上self.automaticallyAdjustsScrollViewInsets = YES;將其添加到視圖。 這是默認啓用的。但在你的情況:

我看你使用EGORefreshHeaderView。它使用UITableView的contentInset。所以當你釋放它時,標題將重置頂部插入而不是恢復以前的值。

-1

如果您想完全控制視圖並避免錯誤地調整iOS,請調用子類UITableView,並在 - (void)willMoveToWindow:(UIWindow *)newWindow中調整插入(滾動和指示符)。適用於我。

7

這適用於SWIFT以及iOS 8.1中

navigationController?.navigationBar.translucent = false; 
+0

爲什麼-1當這適用於快速適用? –

+0

另外,如果你打算投票,至少給出一個原因,爲什麼?我也在這裏學習! –

+0

它工作得很好。不知道爲什麼它被投下來。仇恨者會討厭。 –

20

您可以禁用 中的「擴展邊緣」在這個界面的視圖控制器的屬性檢查器(如下圖所示圖) :

enter image description here

1

夫特4

在viewDidLoad方法中設置以下代碼行:

self.navigationController?.navigationBar.isTranslucent = false