0

我正在創建一個iMessage擴展,其中擴展演示樣式我想使用UINavigationController。我試着用下面的功能導航控​​制器添加爲MSMessagesAppViewController的子視圖:UINavigationController作爲MSMessagesAppViewController的子視圖

private func present(viewController: UIViewController) { 
    viewController.view.frame = view.frame 

    addChildViewController(viewController) 
    viewController.didMove(toParentViewController: self) 

    view.addSubview(viewController.view) 
} 

我期待導航控制器顯示在傳統的方式,配合其導航欄開始略低於頂欄的iMessage本身。請看下圖我預期的結果:

Expected result

然而,似乎view.frame實際上iMessage的頂部欄下方延伸。因此,我的導航控制器的導航欄隱藏在iMessage頂部欄的下方。但是,滾動視圖本身的內容視圖正確定位,無需進一步定製。請參閱下圖的實際結果是:

Actual result

很顯然,我可以設置導航控制器的框架,開始略低於頂吧。不過,我正在尋找不太依賴硬編碼職位的解決方案。如果這樣做,滾動視圖也不會繼續在iMessage頂部欄下方顯示半透明效果。

理想情況下,導航欄將顯示在iMessage頂欄的正下方,就像默認的滾動視圖一樣。

有誰知道解決這個?

+0

看來有更好的解決方案http://stackoverflow.com/questions/38426146/how-to-keep-navigation-bar-from-disappearing-with-msmessagesviewcontroller-ui。 – nouatzi

回答

1

經過一番深思熟慮後,我發現了一個相當不好的解決方案。我仍然接受反饋和其他答案。

人們可以通過創建一個初步的layoutView來實現上述目標,該目標被限制爲使用AutoLayout的佈局指南。然後,通過設置UINavigationController的框架與佈局視圖的框架相匹配,它實際上只會佔用可見區域。

你可以像我一樣使用Storyboard如下設置一個觀點:

LayoutView layout

在你的容器視圖控制器

然後(createStickerViewController在我的情況),只是你UINavigationController的幀分配給您的佈局只要滿足約束條件即可查看:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    // Update frame after constraints have been satisfied for layoutView 
    pickAssetNavigationController.view.frame = layoutView.frame 
} 

結果是導航控制器只佔用實際可見光ible區域,正如預期的那樣,導航欄位於iMessage頂欄的正下方(請參考原始問題中的圖1)。

+0

如果我不通過storyboard創建第二個呈現視圖控制器,你能幫忙嗎?!? – guhan0

+0

@ guhan0你應該可以通過代碼重新創建'layoutView'的約束,就像我在Storyboard中一樣。我沒有嘗試過,但應該沒有區別。 – Aleksander

相關問題