2013-10-11 97 views
4

我正在使用iOS7自定義轉換以模態呈現新的視圖控制器。iOS7自定義轉換與UINavigationController

新的視圖控制器是一個導航控制器。

控制器從底部開始動畫,而背景視圖模糊。

我的問題是,新控制器上的導航欄,雖然向上動畫,似乎允許狀態欄,即它似乎是64點高。當它到達最終位置並稱爲completeTransition時,它實現了不需要狀態欄空間,並重新回到44點。

有沒有辦法來

  • 最初告知不需要狀態欄上的導航控制器/頂視圖控制器。 或
  • 調用completeTransition在動畫之前調用的任何方法,以便自動重新調整。

雖然動畫:

While animating

動畫完成:

Animation complete

回答

7

訣竅是添加所呈現的視圖控制器到容器視圖的視圖AFTER設定其初始位於屏幕底部。這可以防止容器視圖認爲它位於屏幕的頂部,並相應地自動佈置狀態欄。

它與下面從WRESTLING WITH STATUS BARS AND NAVIGATION BARS ON IOS 7

「的UINavigationController將改變其UINavigationBar的的要麼44點或64點的高度,這取決於一個相當奇怪和無證約束集合如果UINavigationController的檢測。其視圖框架的頂部與UIWindow的頂部視覺連續,然後繪製其導航欄的高度爲64點,如果其視圖的頂部與UIWindow頂部不連續(即使僅關閉一個點),則它以「傳統」方式繪製其導航欄,高度爲44點,即使在應用程序的視圖控制器層次結構中存在多個子項,該邏輯也由UINavigationController執行。沒有辦法阻止這種行爲。「

+0

現在似乎很明顯... – maxhs

0

艾倫,因爲你沒有標記你的問題回答我把這個,所以其他人可以找到它。我遇到了類似的情況,你的修復程序在我的情況下不起作用,所以這種更一般的解決方案可能會更加廣泛地有用

發現在這裏Navigation bar has wrong position when modal a view controller with flip horizontal transition in iOS 7

快速解決方法是將:

[self.navigationController.navigationBar.layer removeAllAnimations];  

在要轉換到視圖的viewWillAppear中。這將避免首先將視圖放置在屏幕下方,然後在動畫之前將其移動。

正如您在上面指出的那樣,UINavigationController在某個時刻計算出它的大小,這與動畫相沖突。

0

我有類似的UINavigationBar問題。

在一種情況下,它是在自定義拆分視圖中(我們無法使用UIKit之一,因爲iOS 5.0中缺少一些功能),並且還有將視圖添加到另一個視圖中的UINavigationController。

控制器層次結構的使用在這裏有很多幫助,看起來iOS在決定如何佈局UINavigationBar時也注意一些。我可以在操作系統定義正確的高度的情況下擁有一個UINavigationController,而不必將UINavigationBar與UIWindow的頂部連接起來,這樣就可以做到。

然而,有一個問題,當視圖第一次出現時,它有不正確的高度,然後自動增加,以自己有正確的高度64像素。

從一開始就以正確的高度獲取視圖的解決方案是首先定義具有整個屏幕寬度的視圖,然後使用[UIViewController viewDidLayoutSubviews]方法來定義寬度爲I的視圖的框架通緝。

這意味着控制器以我想要的方式進行UINavigationBar的佈局,然後我會更正視圖的框架並且不會更改UINavigationBar的高度。

對於OP提出的具體情況,您可以做相反的事情。首先用寬度的一半來定義視圖,這樣在開始時條形很小,然後將寬度更改爲所需的寬度。我在另一種情況下測試了它,它也起作用,但它沒有動畫,可能會導致我的解決方案失效。我建議改變寬度和x位置。

這是一個可怕的黑客,所以如果有人想出了一個解決方案,將允許我刪除此代碼,請分享。

相關問題