0

Ich erstelle eine iMessage-Erweiterung wo für die erweiterten Präsentationsstil Ich möchte eine UINavigationController verwenden. Ich versuche, den Navigation-Controller als ein Subview der MSMessagesAppViewController mit der Funktion zum hinzufügen:UINavigationController als Unteransicht zu MSMessagesAppViewController

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

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

    view.addSubview(viewController.view) 
} 

ich die Navigationssteuerung erwartet in der traditionellen Art und Weise angezeigt werden, mit der Navigationsleiste Start knapp unterhalb der oberen Leiste von iMessage selbst. Bitte beachten Sie die folgende Abbildung für mein angestrebtes Ergebnis:

Expected result

Es scheint jedoch, view.frame erstreckt sich tatsächlich unterhalb der iMessage oberen Leiste. Daher ist die Navigationsleiste meines Navigationscontrollers unter der oberen Leiste von iMessage versteckt. Die Inhaltsansicht der Bildlaufansicht selbst wird jedoch ohne weitere Anpassung korrekt positioniert. Bitte beachten Sie die folgende Abbildung für das tatsächliche Ergebnis:

Actual result

Offensichtlich ich den Rahmen der Navigationssteuerung einstellen könnte beginnen knapp unterhalb der oberen Leiste. Ich suche jedoch nach Lösungen, die nicht zu sehr auf hartcodierte Positionen angewiesen sind. Wenn Sie dies tun, wird die Bildlaufansicht auch nicht unterhalb der oberen Leiste von iMessage für diesen transluzenten Effekt fortgesetzt.

Im Idealfall wird die Navigationsleiste genau unter der oberen Leiste von iMessage angezeigt, genau wie die Bildlaufansicht standardmäßig.

Kennt jemand eine Lösung dafür?

+0

Es scheint, es gibt eine bessere Lösung http://stackoverflow.com/questions/38426146/how-to-keep-navigation-bar-from-disappearing-with-msmessagesviewcontroller-ui. – nouatzi

Antwort

1

Nach ein wenig Überlegung, habe ich eine ziemlich hacky Lösung gefunden. Ich akzeptiere immer noch Feedback und andere Antworten.

Man kann das obige erreichen, indem man eine vorläufige layoutView erstellt, die auf die Layout-Guides mit AutoLayout beschränkt ist. Wenn Sie dann den Rahmen von UINavigationController an den der Layoutansicht anpassen, wird er nur den sichtbaren Bereich einnehmen.

Sie können eine Ansicht einrichten wie meine Storyboard wie folgt verwendet:

LayoutView layout

Dann in Ihrem Container-View-Controller (createStickerViewController in meinem Fall) einfach zuordnen den Rahmen Ihres UINavigationController zu der Ihr Layout anzuzeigen, sobald die Bedingungen erfüllt wurden:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

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

das Ergebnis ist, dass die Navigationssteuerung belegt nur, dass die tatsächliche vis In diesem Fall befindet sich die Navigationsleiste wie erwartet unterhalb der iMessage-Leiste (siehe Abbildung 1 in der Originalfrage).

+0

Könntest du mir helfen, wenn ich den zweiten präsentierenden Viewcontroller in der Programmierung nicht über Storyboard erstellt habe?!? – guhan0

+0

@ guhan0 Sie sollten in der Lage sein, das 'layoutView' mit den gleichen Einschränkungen durch Code zu erstellen, genau wie ich es in Storyboard mache. Ich habe das nicht versucht, aber es sollte keinen Unterschied geben. – Aleksander

Verwandte Themen