13

的子視圖我想在一個UINavigationController的頂部顯示一個UILabel。問題是,當我添加的UILabel作爲一個UIWindow的子視圖不會自動旋轉,因爲它不是UIViewController中的一個子視圖(UIViewController的自動處理旋轉期間更新子視圖)。添加一個UINavigationController作爲UIView的

這是我用的是層次結構:

  • 的UIWindow
    • 的UILabel
    • 的UINavigationController

所以我想我可以使用下面的層級:

  • 的UIWindow
    • 的UIViewController
      • 的UIView
        • 的UILabel
        • 的UINavigationController

這樣,標籤可以顯示在UINavigationController的頂部,同時也可以自動旋轉,因爲它是UIViewController的子視圖。

的問題是,當我嘗試添加一個UINavigationController的視圖的子視圖:

[myViewController.view addSubview:myNavigationController.view]; 

會出現20個像素向下。我猜測是因爲它認爲它需要爲狀態欄騰出空間。但是,由於UINavigationController被放置在UIView中,它不會疊加在狀態欄的頂部,因此不正確地添加了20個像素。換句話說,UINavigationBar的頂部是屏幕的40像素標記,而不是20像素。

是否有任何簡單的方法來只是移位的UINavigationController及其所有元件(例如導航欄,工具欄,根視圖控制器)最多20個像素?或者讓它知道它不應該補償狀態欄?

如果不是這樣,我想我需要用我上面提到的第一個層次,並找出如何使它與導航欄的旋轉一致旋轉的標籤。我在哪裏可以找到更多關於如何做到這一點的信息?

注:通過「導航欄的頂部顯示一個標籤」,我的意思是它應該覆蓋在導航欄的頂部...它不能簡單地包裹在欄按鈕項目,並放置爲一體導航欄的項目。

回答

18

使用此代碼似乎工作:

nav.view.frame = CGRectMake(nav.view.frame.origin.x, nav.view.frame.origin.y - 20, 
          nav.view.frame.size.width, nav.view.frame.size.height); 

我這樣做增加了導航控制器作爲一個子視圖之前。使用[UIApplication sharedApplication] .statusBarFrame而不是硬編碼的20也可能是一個好主意。我不確定這是不是最好的方法。

+5

使用 nav.view.frame = CGRectMake(0,0,self.view.frame.size.width,自.view.frame.size.height); \t 使這也適用於ipad,它沒有+20的錯誤,但有其他問題的寬度和高度,而不是整體這是一個總的缸,很馬虎的蘋果 – valexa

+2

我有一個實例,如果我加載一個UINavigationController在iPad上以橫向模式查看子視圖我確實得到了20像素的錯誤。但只是第一次。我可以在以後重新添加到超級視圖,問題將消失。非常非常令人沮喪。 –

+0

看來我有同樣的問題。沒有什麼可以告訴我導航欄的垂直偏移量是20像素。 @DanielWood我真的分享你的挫敗感。如果我推,然後彈出另一個控制器,一切都好,但第一次...我嘗試你的遊戲。 – Vaseltior

2

如果您想要一個表示可用內容區域的框架,那麼您應該只使用:[[UIScreen mainScreen] applicationFrame]。當然,這限制了您的頂級視圖控制器,因此它只能是頂級的。所以仍然有點狡猾,但少一些。

2

爲什麼不使用應用程序框架而不是將原始值添加到一些值?我的意思是使用:

CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 

爲參考幀,並且做這樣的事情:

nav.view.frame = CGRectMake(appFrame.origin.x, appFrame.origin.y, ... 

這一個爲我工作。

0

我實際上有同樣的問題,但設法解決它。

我注意到我的視圖控制器的視圖有正確的框架,但視圖控制器的導航欄沒有(它有一個框架起源(0,20))。

插入此插入視圖的控制器,其導航控制器的上海華:

- (void) viewDidAppear:(BOOL)animated { 
    if (navigationController.navigationBar.frame.origin.y != 0) { 
     [[navigationController view] removeFromSuperview]; 
     [[self view] addSubview:navigationController.view]; 
    } 
} 
相關問題