Gewusst wie: überschreiben trait-Sammlung für die erste UIViewController? (mit Storyboard)
Ich eine app haben, die gezielte iOS8 und initial view controller ist UISplitViewController. Ich benutze storyboard, so dass es freundlich zu instanziieren, alles für mich.
Weil mein design brauche ich SplitViewController beide master-und detail-Ansichten im hochformat auf dem iPhone. Also ich bin auf der Suche nach einer Möglichkeit zum überschreiben der Eigenschaft Kollektion für dieses UISplitViewController.
Fand ich, dass ich verwenden können,
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!) { ... }
aber, leider, es sind nur die Methoden zu überschreiben, untergeordnete Steuerungen Merkmale Sammlungen:
setOverrideTraitCollection(collection: UITraitCollection!, forChildViewController childViewController: UIViewController!)
und ich kann nicht so tun, für sich selbst in meinem UISplitViewController Unterklasse.
Überprüfte ich eine Beispiel-app Adaptive Fotos von Apple. Und in dieser app Autor spezielle TraitOverrideViewController als root und etwas Magie in seine viewController setter zu machen, es funktioniert alles.
Es sieht schrecklich für mich. Gibt es irgendeine Möglichkeit um zu überschreiben Eigenschaften? Oder Wenn nicht, wie kann ich verwalten, um die Verwendung der gleichen hack mit storyboard? In anderen Worten, wie wird Spritzen einige viewController als root nur mit traits für meine UISplitViewController mit storyboard?
- Warum muss es schrecklich Aussehen?
AAPLTraitOverrideViewController.m
ist kaum mehr als 20 Zeilen code. Sollte es dauert vielleicht 10 Minuten zu übersetzen, dass in Swift und dann müssen Sie nicht haben, um es zu betrachten wieder. - siehe update. Und Nein, ich glaube nicht, dass diese Art der code frei zu halten. Endlich jetzt muss ich erklären, meine colleges, was es ist und warum wir einen benötigen. Ich kann mir nicht Grund, über jede Zeile, die macht mich schlecht fühlen. Warum müssen wir didMoveToParentViewController? Oder warum müssen wir shouldAutomaticallyForwardRotationmethods wenn es veraltet ist?
- und die Beispiel-app nicht überprüfen Charaktereigenschaften auf den laden, so wird es in falsche Bedingung wenn Sie starten Sie es im portrait... mein code oben Erben dieses Problem. Wird aktualisieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich wünschte, es gäbe einen anderen Weg, um dieses, aber für jetzt habe ich nur konvertiert, code die aus dem Apple-Beispiel zu Swift und angepasst für die Benutzung mit Storyboards.
Funktioniert es, aber ich glaube immer noch, es ist eine schreckliche Art und Weise zu archivieren, dieses Ziel zu erreichen.
Meine TraitOverride.swift:
Damit es funktioniert, müssen Sie eine neue UIViewController auf dem storyboard und machte es der ersten. Fügen Sie show segue von Sie zu Ihrem real-controller wie diesem:
Müssen Sie die Namen der segue "toSplitVC":
und ursprünglichen controller TraitOverride:
Nun sollte es für Sie zu arbeiten. Lassen Sie mich wissen, wenn Sie einen besseren Weg, oder keine Fehler in dieser.
Ich verstehe, dass Sie wollte, einen raschen übersetzung hier... Und Sie haben wahrscheinlich das Problem.
Unten ist etwas, verbrachte ich eine beträchtliche Zeit zu lösen versuchen - immer meine SplitView arbeiten auf einem iPhone 6+ - dies ist eine Kakao-Lösung.
Meine Anwendung ist TabBar und die SplitView hat Navigation-Controller. Am Ende mein Problem war, dass setOverrideTraitCollection war nicht an das korrekte Ziel.
Ich weiß, es ist mehr als ein Jahr, seitdem die Frage gestellt wurde, aber ich glaube, meine Antwort hilft jemanden wie mir, der nicht erzielte Erfolg mit der akzeptierten Antwort.
Erar-beitet, die Lösung ist wirklich einfach, können Sie einfach überschreiben
traitCollection:
Methode. Hier ist ein Beispiel aus meiner app:die Idee ist die Kraft, die Kompakte Größe-Klasse auf dem iPad wenn der controller wird als popover oder Formular.
Hoffe, es hilft.
UPDATE:
Apple nicht empfehlen, dies zu tun:
Ich bin nicht mit dieser Methode nicht mehr! Jetzt bin ich die Umsetzung
overrideTraitCollectionForChildViewController:
im übergeordneten viewControler Klasse.traitCollection
: developer.apple.com/reference/uikit/uitraitenvironment/...Ja, es muss custom container View Controller, um die Funktion überschreiben viewWillTransitionToSize. Verwenden Sie das storyboard zum festlegen der container View Controller wie der erste.
Sie können auch finden dieses gute Artikel, die das Programm verwenden, um es zu implementieren. Gemäß ihm, Ihr Urteil portait konnte einige Einschränkungen:
andere als
"
Den zusätzlichen top-level-VC eignet sich gut für eine einfache app, aber es wird nicht weitergegeben hinunter zum Modal vorgestellt VC, da Sie nicht über eine parentVC. So müssen Sie stecken Sie es wieder an verschiedenen stellen.
Einen besseren Ansatz, den ich fand, war nur eine Unterklasse UINavigationController und dann verwenden Sie einfach die Unterklasse in das storyboard und anderswo, wo Sie normalerweise verwenden würden, UINavigationController. Das spart zusätzliche VC Unordnung in storyboards und spart auch zusätzliche Unordnung im code.
Diesem Beispiel wird alle iPhones verwenden regelmäßige horizontale Größe Klasse für Landschaft.
overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection?
Props An @Ilyca
Swift 3
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
wie in den Swift 2 code oben (mit ein paar änderungen).