Ich erstelle eine benutzerdefinierte GUI in einer universellen App für iPhone und iPad. Auf dem iPad wird stark auf "sideViews" für Dienstprogramme wie Inhaltsmanipulation, detailInformation und dergleichen (denken Sie an eine erweiterte SplitView). Von einem visuellen Standpunkt aus betrachtet, ist der neue UIPresentationController genau das Richtige für mich, um diese "sideViews" zu präsentieren (und nicht ein dimmedView zu verwenden) und die Implementierung war einfach zu erstellen und zu pflegen, während sie immer noch gut in das Storyboard integriert ist. Aber ich muss in der Lage sein, den Inhalt des presentingViewControllers zu manipulieren, während der presentedViewController sichtbar ist. Meine Frage ist also, kann ich userInteractionEnabled (oder ähnliches) auf dem presentingViewController setzen, während ich die sideViews präsentiere?
UIPresentationController
fügt seine Containeransicht als eine Fensterunteransicht oberhalb der präsentierenden Ansicht ein, sodass alle Berührungen außerhalb der präsentierten Ansicht von der Containeransicht gefangen werden und nicht zur präsentierenden Ansicht gelangen .
Das Problem besteht darin, eine Ansicht in die Containeransicht einzufügen, die durch Berührungen an die präsentierende Ansicht geleitet wird. Sie können dies als Dimmansicht verwenden oder backgroundColor
auf [UIColor clearColor]
für eine vollständig transparente Ansicht festlegen. Legen Sie die Passthrough-Ansichten in Ihrem Präsentations-Controller-Code fest.
Hinweis: Dies verletzt zwar den Geist von -[UIView hitTest:withEvent:]
, da es keine Subview zurückgibt, aber tatsächlich behandelt der Systemstandard UIPopoverPresentationController
dies. Wenn Sie die Eigenschaft passthroughViews
dort festlegen, reagiert die Containeransicht auf hitTest:withEvent:
mit einer Passthrough-Ansicht, obwohl sie keine Superview / Subview ist! Daher wird es wahrscheinlich die nächste iOS-Version überleben.
Okay, so scheint es, dass die Idee des UIPresentationControllers NICHT in der Lage ist, es als fortgeschrittenes SplitView zu benutzen (oder zumindest ist das meine derzeitige Schlussfolgerung). Es ist mir jedoch gelungen, einen Workaround zu erstellen. Wenn jemand einen besseren Weg findet, damit umzugehen, lass es mich in den Kommentaren wissen.
Also stelle ich die Ansicht von PresentingViewController in die transitionContexts containerView-Hierarchie (wie die Hierarchie UIPresentationControllers containerView) bei Index 0. Damit kann ich touchEvents in der PresentingViewControllers-Ansicht transparent verarbeiten. Aber es entfernt die PresentingViewControllers-Ansicht aus der ursprünglichen Ansichtshierarchie, so dass ich sie zurückbewegen muss, wenn die Präsentation beendet wird. Das bedeutet, dass die Ansicht zurück in die Ansicht des parentViewControllers gesetzt wird, falls vorhanden, oder in das Fenster der App, wenn presentingViewController der rootViewController der App ist (möglicherweise gibt es auch andere Szenarien, aber das reicht vorerst).
Dies geschieht in animateTransition in UIViewControllerAnimatedTransitioning.
Hier ist das Stück Code:
%Vor% Modale Präsentation ist für Ihre Situation nicht gut geeignet. Es ist besser, Ihr Szenario mit einem benutzerdefinierten Container-View-Controller zu implementieren und die Methode showDetailViewController:sender:
zu überschreiben, um die Darstellung zusätzlicher View-Controller zu steuern. Sie können diese Methode anpassen, um View Controller Modal auf dem iPhone und rechts auf dem iPad zum Beispiel zu zeigen.
Hier ist ein Auszug aus Apple-Dokumentation :
Präsentieren und Anzeigen eines View-Controllers
Die UIViewController-Klasse bietet zwei Möglichkeiten zum Anzeigen einer Ansicht Controller:
Der showViewController: sender: und showDetailViewController: sender: Methoden bieten die anpassungsfähigste und flexibelste Möglichkeit zum Anzeigen von Ansichten Controller. Diese Methoden lassen den präsentierenden View-Controller entscheiden Wie gehe ich am besten mit der Präsentation um? Zum Beispiel eine Containeransicht Controller könnte den View-Controller als Kind einbinden modal präsentieren. Das Standardverhalten präsentiert die Ansicht Controller modal. Der presentViewController: animiert: Vervollständigung: Methode zeigt den View Controller immer modal an. Die Aussicht Controller, der diese Methode aufruft, kann die Präsentation, aber die Präsentation ist immer modal. Diese Methode passt sich an der Präsentationsstil für horizontal kompakte Umgebungen. Das showViewController: sender: und showDetailViewController: sender: Methoden sind der bevorzugte Weg, um Präsentationen zu initiieren. Eine Sicht Controller kann sie anrufen, ohne etwas über den Rest zu wissen die View-Controller-Hierarchie oder die aktuellen View-Controller Position in dieser Hierarchie. Diese Methoden erleichtern auch die Wiederverwendung Betrachte Controller in verschiedenen Teilen deiner App, ohne sie zu schreiben bedingte Codepfade.
Tags und Links ios ios8 uipresentationcontroller setuserinteractionenabled