Interaktiver ViewController-Übergang, der gleichzeitig von Prise- und Pan-Gestenerkennern ausgelöst wird

8

Ich habe zwei viewControllers:

ViewController1

Ein komplexer Stapel von Subviewcontrollern mit irgendwo in der Mitte einer imageView

ViewController2

Ein scrollView mit eingebettetem imageView

Was ich versuche zu erreichen, ist ein Übergang zwischen den beiden viewControllern, der ausgelöst wird, indem man die imageView von viewController 1 zwickt, so dass sie hineinzoomt und zu viewController 2 umschaltet. Wenn die Transition beendet ist, sollte die imageView gezoomt werden soweit es während des durch die Pinch-Geste ausgelösten Überganges gezoomt wurde.

Gleichzeitig möchte ich das Verschieben des Bildes während des Zoom-Übergangs unterstützen, so dass das Bild im Endzustand genau wie beim Zoom in den Ort umgewandelt wird, an den es gedreht wurde.

Bisher habe ich den Hero-Transitions-Pod ausprobiert und einen benutzerdefinierten ViewController-Übergang, den ich selbst geschrieben habe. Das Problem mit den Heldenübergängen besteht darin, dass das Bild im zweiten ViewController nicht richtig in den Endzustand eingerastet wird. Das Problem, das ich mit dem benutzerdefinierten ViewController-Übergang hatte, war, dass ich nicht gleichzeitig Zoomen und Schwenken zur gleichen Zeit arbeiten konnte.

Hat jemand eine Idee, wie man das in Swift implementiert? Hilfe wird sehr geschätzt.

    
Menno 26.02.2018, 13:56
quelle

2 Antworten

4

Die Frage kann in zwei geteilt werden:

  1. So implementieren Sie den Pinch-Zoom und das Ziehen mit der Schwenkgeste in imageView
  2. Wie präsentiert man einen View-Controller mit einer seiner Unteransichten ( imageView in vc2), die wie eine Unteransicht ( imageView in vc1) im Presenting-View-Controller
  3. positioniert sind

Pinch-Geste zoomen: Pinch-Zoomen ist einfacher mit UIScrollView zu implementieren, da es standardmäßig unterstützt wird, ohne dass der Gestenerkenner hinzugefügt werden muss. Erstellen Sie eine scrollView und fügen Sie die Ansicht, die Sie zoomen möchten, mit Pinch als Unteransicht hinzu ( scrollView.addSubview(imageView) ). Vergessen Sie nicht, auch scrollView selbst hinzuzufügen ( view.addSubview(scrollView) ).

Konfigurieren Sie die Zoomstufen scrollView's min und max: scrollView.minimumZoomScale, scrollView.maximumZoomScale . Setzen Sie einen Delegaten für scrollView.delegate und implementieren Sie UIScrollViewDelegate :

func viewForZooming(in scrollView: UIScrollView) -> UIView?

Was in diesem Fall Ihre imageView zurückgeben soll, und

Entsprechen Sie auch UIGestureRecognizerDelegate und implementieren Sie:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool

Was sollte wahr werden. Dies ist der Schlüssel, der es uns ermöglicht, die Pan-Gesten-Erkennung mit dem internen Pinch-Gesten-Erkenner zu arbeiten.

Ziehen der Pan-Geste: Erstellen Sie einfach einen Pan-Gesten-Erkenner mit einem Ziel und fügen Sie ihn der Bildlaufansicht scrollView.addGestureRecognizer(pan) hinzu.

Umgang mit Gesten: Der Pinch-Zoom funktioniert zu diesem Zeitpunkt gut, außer dass Sie den zweiten View-Controller präsentieren möchten, wenn der Pinch endet. Implementieren Sie eine weitere UIScrollViewDelegate -Methode, die benachrichtigt werden soll, wenn das Zoomen endet:

func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat)

Und rufen Sie Ihre Methode auf, die den Detailansicht-Controller presentDetail() darstellt, wir werden es in ein bisschen implementieren.

Der nächste Schritt ist die Pan-Geste. Ich lasse den Code sich erklären:

%Vor%

Die Implementierung verschiebt imageView nach der Schwenkposition und ruft presentDetail() auf, wenn die Geste endet.

Bevor wir presentDetail() implementieren, gehen Sie zum Detailansicht-Controller und fügen Sie Eigenschaften hinzu, die imageViewFrame und image selbst enthalten. In vc1 implementieren wir nun presentDetail() als solches:

%Vor%

Stellen Sie in Ihrem DetailViewController sicher, dass imageViewFrame und das Bild z. viewDidLoad und du wirst eingestellt.

Komplettes Arbeitsbeispiel:

%Vor%     
Lukas 07.03.2018, 22:26
quelle
3

scheint wie UIView.animate(withDuration: animations: completion:) Ihnen helfen sollte; Zum Beispiel können Sie in animations block einen neuen Bildrahmen setzen und in completion: - den zweiten View-Controller (ohne Animation);

    
user3206558 06.03.2018 23:19
quelle

Tags und Links