2013-09-24 111 views
17

我(就像其他人一樣)正在遇到與其他人相同的狀態欄重疊問題,並且有點麻煩,這就是爲什麼我會爲此打開一個新問題。UISearchBar與iOS中的狀態欄重疊

似乎有一些機制,讓UISearchBar知道自己的位置,這是完全 out of whack。

jaredsinclair在這裏回答(iOS 7 status bar back to iOS 6 default style in iPhone app?),詳細解釋了Apple工程師如何讓我們將邏輯引入到我們的應用程序中,以便儘可能融入用戶環境。

我經歷了仔細檢查我的應用程序中的每個UIViewController並儘可能進行細微修改的過程。

在大多數情況下,我能解決使用下面我發現翻過幾個代碼,以便回答

// Do any additional setup after loading the view. 
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){ 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

然而,這不會不管我做什麼,在一個特定的圖,其中UINavigationBar的是工作問題隱。

UISearchBar on top of status bar

基於跨SO我能夠通過將以下的邏輯塊對這個特定的UIViewController

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { 
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
    viewFrame.origin.y = viewFrame.origin.y+statusBarFrame.size.height; 
} 

這推動的UIViewController Ñ像素向下來解決這個問題找到了解決辦法取決於狀態欄的高度。

這樣做的效果是在這裏展示

Hacked position UISearchBar

問題是,當我進入搜索領域的UISearchBar本身增加了頂部,抵消了整個UI一個20像素的填充。

enter image description here

這使我的的UISearchBar試圖調整自己的結論,而巧合它自身調整的確切相同數量的狀態欄的高度。

如果我不砍的位置,一旦我進入搜索領域那麼這個自動調整對齊整齊的UISearchBar狀態欄下方。

我希望我詳細說明了我的困惑,我想知道是否有人對解決方案有任何想法。

+0

對這個問題有什麼好運?我有完全相同的問題。我在截圖中注意到您正在使用某種「滑出導航」。控制器。我也是,也許這是問題的一部分? – Chilly

+0

你好@Chilly沒有解決方案,但不幸的是,但下週,我們又開始了UI的又一次迭代,我將更多地考慮這個問題,目前我們正在發佈這種討厭的東西,我會讓你擺脫 –

回答

27

如果的導航欄是可見的請執行下列操作

通過把它們20pt調節所有的UIView元素

+0

現貨。如果你使用的是界面構建器,你可以使用iOS6/7增量:首先,「視角爲iOS 6.0」,然後設置「20」的增量以在iOS 7中實現+20偏移量(必須在所有需要碰撞的視圖上設置下)。 –

+0

我的搜索欄已隱藏,我在導航欄中添加了一個切換按鈕。在iOS 6中,它運行良好,現在它可以在iOS中使用self.edgesforExtendedLayout設置。謝謝! – Ismael

+0

請幫我看看如何移動所有的UIView元素 – Anees

4

這個問題也一直在努力。你需要把它放到你的ViewControllers的viewDidLoad方法中。

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

這應該解決它。它也在iOS 7過渡指南中說過。 https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

+0

謝謝Ben,if你讀了我的問題,我已經試過了。即使它工作,它也不能解決自動調整UISearchBar 20px –

+0

對不起,我無法幫助你。無論如何,在我的應用程序它的工作,當我設置edgesForExtendedLayout搜索字段框架保持原樣,當它不活躍。沒有20像素的偏移量。 –

0

我不太清楚關於調整自己身高的搜索欄 - 我的搜索欄不這麼做嗎?但。

可以在IB約束添加到頂部佈局指南,爲搜索欄。這會導致它在ios 6和ios 7中粘貼到狀態欄的底部。如果您隨後刪除手動調整狀態欄高度的代碼。這應該照顧它。你可以看到如何做到這一點這裏一個例子:https://developer.apple.com/library/ios/qa/qa1797/_index.html

4

的UISearchBar有你想要的東西的委託方法。只需從頂部放置20像素即可。

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar 
{ 
    return UIBarPositionTopAttached; 
} 

不幸的是,它不能與UISearchDisplayController一起工作。如果的導航欄被隱藏就在viewDidLoad中以下

self.edgesForExtendedLayout = UIRectEdgeNone; 

:在viewDidLoad中

2

我得到了完全相同的問題,並基於像@奔的與here建議,我最終加入以下代碼,幫助我:

- (void) viewDidLayoutSubviews 

    { 
     if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) 
     { 
      CGRect viewBounds = self.view.bounds; 
      CGFloat topBarOffset = self.topLayoutGuide.length; 
      viewBounds.origin.y = topBarOffset * -1; 
      self.view.bounds = viewBounds; 

      self.edgesForExtendedLayout = UIRectEdgeNone; 
     } 
    } 

或者該代碼也可以

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 

     self.automaticallyAdjustsScrollViewInsets=YES; 
     self.edgesForExtendedLayout = UIRectEdgeNone; 
     self.navigationController.view.backgroundColor = [UIColor whiteColor]; 
     self.navigationController.navigationBar.translucent = YES; 
    } 
+0

你把這段代碼完全放在哪裏? –

+0

我把它放在我的表格查看器的實現類中,我希望這很有用。 – malkoty

2

如果有人想解決通過自動版式這個問題,而不是添加約束searchBar.top = self.view.top添加約束到topLayoutGuide,像這樣:

searchBar.top = topLayoutGuide.bottom