Kann ich einen UIPresentationController veranlassen, userInteractionEnabled auf PresentingViewController zu haben?

8

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?

    
jollyCocoa 13.02.2015, 13:16
quelle

3 Antworten

11

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.

%Vor%

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.

    
Glen Low 08.07.2015, 11:33
quelle
2

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%     
jollyCocoa 16.02.2015 06:50
quelle
1

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.

    
Alexander Belyavskiy 25.10.2016 20:50
quelle