2015-02-11 12 views
11

Wir haben einen MainViewController mit einem TableView, und es präsentiert einen neuen ModalViewController.iOS8 - Rotation bei der Darstellung verhindern viewController

Der MainViewController ist auf Hochformat beschränkt und der ModalViewController kann sich drehen.

Das Problem in iOS8 ist, dass, wenn die modalViewController die Callback-Methode der Drehung in iOS8 in Mainviewcontroller dreht, genannt wird - - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

Somit ist die UITableView seine Daten neu geladen wird immer, das ist ein Verhalten, das wir don‘ Ich will.

Können wir diese Funktion von iOS 8 verhindern und den präsentierenden UIViewController nicht drehen?

+0

Wird der Callback überhaupt auf iOS7 aufgerufen? Da gemäß der [Dokumentation] (https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIContentContainer_Ref/index.html#//apple_ref/occ/intfm/UIContentContainer/viewWillTransitionToSize:withTransitionCoordinator:) auf iOS8 – Leonardo

+0

@Leonardo in iOS7 eingeführt wurde, alles ist in Ordnung, das ist in der Tat ein Merkmal iOS8, die ich nicht will ... – oren

+0

es außer Kraft setzen und es nichts zu machen tun – Leonardo

Antwort

11

Also nach langen Tagen der Suche und Untersuchung, kam ich schließlich mit einer möglichen Lösung.

Zunächst kann ich Navigationscontroller verwenden und den ViewController schieben, anstatt es zu präsentieren, aber es bricht meinen Code und ist nur nicht so wahr.

Die zweite Sache, die ich tun kann, ist nicht Einschränkungen festlegen. Ich kann immer noch das automatische Layout verwenden, aber wenn ich keine Einschränkungen festlege und die Standard-Constraints gesetzt sind, wird das TableView nicht neu geladen. Natürlich ist das auch nicht sehr schlaues zu tun, da ich viele Elemente in meinem ViewController habe.

Schließlich habe ich herausgefunden, dass ich diese "modale" ViewController in einem anderen UIWindow zeigen kann. Ich erstelle UIWindow und setze den modalViewController als rootViewController.

Ich habe einige Beispielprojekt in git: https://github.com/OrenRosen/ModalInWindow

Hoffe, dass es nützlich sein wird.

+0

Perfekt !!!genau das habe ich gesucht –

+0

Das habe ich schon lange gesucht und gesucht. Vielen Dank @oren –

+0

@oren Ich habe dieses Problem auch auf iOS 9. Workaround ist die Überprüfung für presentedViewController – onmyway133

0

Ich habe etwas getan similar mit einem Navigationscontroller, der sich nicht drehen würde, es sei denn, der oben geschobene Controller dreht sich.

In Ihrem Fall überprüfen Sie, ob der Hauptcontroller einen anderen Controller präsentiert. Wenn dies nicht der Fall ist, dann lehne einfach die Rotation ab, andernfalls gib zurück, was auch immer der präsentierte Controller für die Rotationsmethode zurückgibt.

Wie für Ihre Tabellenansicht, sollte es reloaded aufgrund von Rotationen nicht erhalten.

+0

Ich muss model die ViewController präsentieren, und nicht push ViewController, ich weiß bereits, dass beim Drücken von ViewController es nicht gedreht wird, lesen Sie bitte die Kommentare und andere Antworten, bevor Sie eine Frage stellen. Und wenn sich der präsentierte viewController modal in iOS8 präsentiert, rotiert der gesamte Bildschirm und beeinflusst auch den presentingViewController. Danke trotzdem – oren

+0

Ich lese die Frage, und weiß, dass Sie präsentieren möchten, nicht schieben. Ich habe Ihnen nur ein Beispiel mit Push-Controllern gegeben, die auch mit den präsentierten Controllern funktionieren könnten. – Rivera

+0

Danke, ich weiß es zu schätzen. Aber ich habe alle möglichen Lösungen ausprobiert und nicht für mich gearbeitet. Es sieht nur so aus, als würde sich der darstellende viewController nicht drehen, aber die Größe der Ansicht ändert sich. Jedenfalls habe ich es mit einem zusätzlichen UIWindow gelöst. Inzwischen funktioniert es wie ein Zauber, aber ich warte immer noch auf ein unerwartetes Verhalten ... :) – oren

0

In iOS 8 ist die Ansicht, die sich dreht, wenn Sie die Geräteausrichtung ändern, die erste Ansicht, die der hinzugefügt wird. Wenn Sie also in Ihrer presentedController einen Verweis darauf speichern, können Sie die Werte shouldAutorotate und supportedInterfaceOrientations überschreiben.