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.
Die Frage kann in zwei geteilt werden:
imageView
imageView
in vc2), die wie eine Unteransicht ( imageView
in vc1) im Presenting-View-Controller 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:
Stellen Sie in Ihrem DetailViewController
sicher, dass imageViewFrame
und das Bild z. viewDidLoad
und du wirst eingestellt.
Komplettes Arbeitsbeispiel:
%Vor% 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);
Tags und Links ios swift uikit-transitions