2014-03-01 38 views
7

我在使用上,我只是無法解析UINavigationItem提示一個問題...UINavigationItem及時發佈

我有一個主機和一個詳細視圖控制器。當我從主推到詳細地示出的詳細視圖控制器上的提示:

prompt

然而,當我彈出回主視圖控制器,所述視圖不調整大小和窗口顯示通過(該窗口已被染成紅色):

window

這只是發生在iOS7,對iOS6的視圖大小調整預期。

我已經嘗試了一些東西,例如在viewWillDisappearviewDidDisappear中設置提示爲零,但沒有任何東西似乎修復它。

如果我將導航欄中的導航欄設置爲半透明,它確實解決了這個問題 - 不幸的是這不是一個選項。

我已經在這裏創造一個非常小的例子項目,該項目演示了這個問題:提前https://github.com/InsertWittyName/NavigationItemPrompt

感謝您的幫助!

+0

很可能(甚至可能),這是一個iOS錯誤。你檢查7.1嗎? – Kevin

+0

複製並打印'po [[UIApplication sharedApplication] .keyWindow遞歸描述]' –

+0

請暫停應用程序您嘗試過使用Autolayout嗎? –

回答

3

我能想到的解決方案是對主設備的UIView進行子類化,並實現viewDidMoveToSuperview以將視圖的框架從導航欄的高度設置爲超級視圖的結尾。由於導航欄不是半透明的,因此您的工作更容易,因爲您不必考慮佈局指南和內容插頁。

有幾件事要注意。在推送和彈出時,系統會將視圖控制器的視圖移動到另一個動畫超級視圖中,然後將其返回給導航控制器的私有視圖層次結構。另外,當視圖超出視圖層次時,超視圖變爲nil

下面是一個示例實現:

@interface LNView : UIView 

@end 

@implementation LNView 

- (void)viewDidMoveToSuperview 
{ 
    [super viewDidMoveToSuperview]; 

    if(self.superview != nil) 
    { 
     CGRect rect = self.superview.bounds; 

     rect.origin.y += 44; 
     rect.size.height -= 44; 

     [self setFrame:rect]; 
    } 
} 

@end 

這不是一個完美的執行,因爲它使用導航欄的高度硬編碼的值,並沒有考慮到可能的工具欄等,但所有這些你可以作爲屬性添加到此視圖中,並在viewDidLoad開始進入視圖層次結構之前,根據您的需要設置參數。

+0

感謝您的建議。我試過這個(重寫'didMoveToSuperview'),但是它在彈出後將視圖留在不一致的大小。你會如何建議我嘗試你的備用'隱藏視圖控制器彈出'解決方案後的提示? – InsertWittyName

+0

@InsertWittyName你能解釋不一致的大小嗎?我在我們的項目中做到了這一點,並且工作,我們的導航欄是半透明的。我刪除了我的其他建議,我檢查了並且提示顯然與導航項目相關聯。 –

+0

我假設你的意思不是半透明的。當視圖被調整大小時,它的尺寸不正確,它位於導航欄下方(我通過在視圖控制器視圖頂部放置紅色視圖來測試該視圖,該視圖在所有方面都比它小几個像素)。請隨意分解代碼以演示修復工作。 – InsertWittyName

0

你已經給出了自己的答案 - 出色。這是一個錯誤,但檢查Translucent可以避免該錯誤。因此,解決方案是檢查半透明,然後進行補償,使導航欄看起來像你想要的。

爲此,請製作一個小的黑色矩形圖像並將其包含在您的項目中。將導航欄的背景圖像設置爲該圖像。檢查半透明。問題解決了!導航欄現在在外觀上呈黑色不透明,但不再顯示該錯誤。

enter image description here

+2

我再說一遍 - 你已經分析了這個bug的漏洞。請使用您的示例項目向Apple提交錯誤報告。 – matt

+1

我非常欣賞這種努力,但我不能將導航欄設置爲半透明,因爲它影響後續視圖控制器上每個單獨視圖的佈局(即它們位於導航欄的下方)。 – InsertWittyName

+0

我嘗試使用'edgesForExtendedLayout'中的值玩,但它沒有按預期工作。如果你能使用這種方法使它工作,請給我看看這些變化。 – InsertWittyName

0

斯威夫特版本:

class PromptViewSideEffect: UIView { 

override func didMoveToSuperview() { 
    super.didMoveToSuperview() 
    if let superview: UIView = self.superview { 
     let rect: CGRect = superview.bounds 
     rect.origin.y += 44 
     rect.size.height -= 44 
     self.frame = rect 
     } 
    } 
} 
1

當用戶點擊返回按鈕您可以刪除的提示,這樣

override func willMove(toParentViewController parent: UIViewController?) { 
    super.willMove(toParentViewController: parent) 
    if parent == nil { 
     navigationItem.prompt = nil 
    } 
} 
0

存在是否你的導航條的問題是不透明或半透明的。它吮吸蘋果已經允許這個令人髮指的錯誤困擾我們三年多了。

所有這些解決方案都是黑客。我的解決方案是:A)從不使用提示,或者B)在每個視圖中使用它們,即使必須將它們設置爲「」。