2017-03-15 88 views
0

我正在返回「舊」xcode 7/swift 2項目。Xcode 8/Swift 3/ios 10導航欄的變化?

在我所有的導航欄中發生了一些奇怪的事情。

我有這樣的代碼:

@IBOutlet weak var outletCatalogNav: UINavigationItem! 

//... 

outletCatalogNav.title = "my title"; 

//... 

outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton)); 

//...  

if (outletCatalogNav.leftbarButtonItem != nil) { 
    outletCatalogNav.leftbarButtonItem.leftBarButtonItem!.title = " back" 
} 

這則在這樣的代碼視圖切換結束:

TmpOldViewController.present(TmpNewViewController!, animated: TmpAnimate, completion: nil): 

信息:由於歷史原因,我處理視圖控制器改變自己當成了iOS應用程序代碼是從完全不同的開發平臺,語言和環境轉換而來的。

無論如何,過去按鈕只會放在標題的左邊。現在在ios10模擬器中,至少它會呈現在下面(但仍然在左邊),這意味着我用於導航欄的原始高度已不再足夠(因爲它正在被其他控件覆蓋) - 在下面的屏幕截圖中,您可以看到這與左下角的藍色文字暗示。

enter image description here

約束是:

Navigation Bar.top = Top Layout Guide.bottom 
TableViewCatalog.top = Navigation Bar.bottom 
Navigation Bar.leading = leadingMargin - 20 
trailingMargin = Navigation Bar.trailing - 20 

是什麼改變了?我無法找到導航欄中發生變化的任何參考。作爲參考,因爲更改爲swift 3,我現在只針對ios8 +,所以我不需要ios7兼容解決方案。

+0

您是否正在使用獨立的導航欄,然後(意思是,只有酒吧,沒有導航控制器)? – leanne

+0

@leanne是的 - 我添加了更多的代碼和解釋,以防萬一它是相關的。 – Tom

+0

另外幾個問題:1)你對導航欄有哪些其他限制? 2)在實際設備上運行時是否做同樣的事情? – leanne

回答

0

通過在viewDidLoad中()一些瘋狂的嘗試和錯誤,我發現爲什麼會出現此錯誤:

如果我創建一個空頭銜,我得到了按鈕的問題,即是這樣的:

outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton)); 

創建一個非空的標題和它的工作原理:

outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "test", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton)); 

在這兩種情況下的標題實際上也是後來設置 - 但什麼在創建按鈕時,問題是有一個非空標題。

1

我不知道iOS 10中有關獨立導航欄的變化,所以我無法專門回答你的問題。不過,我可以告訴你兩種可能的方法來解決這個問題:

1)設置適當的約束和值的獨立導航欄:
確保如下約束條件設置:
- 導航Bar.Top =頂部佈局Guide.Bottom
- 導航Bar.Leading = Superview.Leading
- 導航Bar.Trailing = Superview.Trailing

然後,在身份檢查器杆,添加與這些值的用戶定義的屬性:
- 主要路徑:barPosition
- 類型:Number
- 值:3

這將安裝獨立的導航欄在這樣一種方式,就像它的連接到導航控制器就會採取行動。

注意:酒吧將出現在故事​​板,就好像它不是正確的高度。沒關係!當您真正運行應用程序時,它會進行適當的調整。

更新:相同的溶液,但不使用的「用戶定義屬性」:
- 確保約束如上所述設置。
- 將故事板的導航欄作爲@IBOutlet連接到其視圖控制器。
- 在視圖控制器的類中,爲類聲明添加一個UINavigationBarDelegate協議。
- 在視圖控制器的viewDidLoad方法中,將導航欄的代理設置爲self。
- 在視圖控制器中,添加酒吧定位委託的positionForBar方法。返回代表TopAttached的UIBarPosition。 (注意:UINavigationBarDelegate從UIBarPositioningDelegate繼承此方法。)

有關更多詳細信息,請參閱Easily use a Navigation Bar without a corresponding Navigation Controller演示GIF。

有關「用戶定義屬性」的方法的進一步細節,請參閱Even more easily use a Navigation Bar without a corresponding Navigation Controller!

2)嵌入的視圖到導航控制器:
- 在情節串連圖板,刪除「獨立的」導航欄。
- 確保選擇導航欄的視圖。
- 從菜單中選擇編輯器/嵌入/導航控制器。

注意:您不需要編寫任何代碼或爲導航控制器創建子類。它會自動適當地處理您的導航欄。


在旁註:我有一個應用程序,在iOS 7中創建,也有一個獨立的導航欄。在Xcode 8/iOS 10中,它有同樣的問題。

我使用了上面的第一種方法,它修復了導航欄的問題。不過,我在發佈時閃爍(可能與iOS 10中的酒吧動畫有關)。

我正在使用啓動圖像。我想到,圖像可能與導航欄動畫相關。所以,我切換到方法2,將我的視圖嵌入導航控制器。然後,我刪除了我一直使用的啓動圖像,並添加了一個新的啓動屏幕 - 內置導航控制器的視圖。一起,這照顧了閃爍。

+0

是否有任何特別的原因,你沒有設置:TableViewCatalog.top =導航Bar.bottom?我可以保留這個嗎? – Tom

+0

使用解決方案#1:你通過設置barPosition做什麼 - 可以以某種方式完成運行時? – Tom

+0

您的解決方案#2 - 是否意味着我不得不刪除或至少重寫所有我自己的邏輯,以便在整個應用程序中使用它來控制要呈現的視圖? (這是一個相當簡單的基於棧的邏輯,但仍然 - 理論上我可能有一天更願意「回退」多個級別) – Tom