0

私はプレゼンテーションスタイルの拡張のためにiMessage拡張を作成しています私はUINavigationControllerを使いたいと思います。私は、以下の機能を使用してMSMessagesAppViewControllerのサブビューとしてナビゲーションコントローラを追加しようとしています:MSMessagesAppViewControllerのサブビューとしてのUINavigationController

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

少しの審議の後、私は非常にハッキーな解決策を見つけました。私はまだフィードバックや他の答えを受け入れています。

AutoLayoutを使用してレイアウトガイドに制約されている予備のlayoutViewを作成することで、上記を達成できます。次に、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 
} 

結果として、ナビゲーションコントローラは実際の視界を占有しますiMessageのトップバーのすぐ下にナビゲーションバーが配置されています(元の質問の図1を参照)。

+0

ストーリーボードではなく、コーディングで2番目に表示されたviewcontrollerを作成した場合は助けてください。 – guhan0

+0

@ guhan0ストーリーボードと同じように、同じ制約を持つ 'layoutView'をコードで再作成できるはずです。私はこれを試していませんが、違いはありません。 – Aleksander

関連する問題