Ich möchte eine perspektivische Transformation in einem UIView durchführen (wie im Coverflow zu sehen).
Weiß jemand neu, ob dies möglich ist?
Ich habe untersucht, CALayer
wie ich alle pragmatischen Programmierer-Core-Animation-Podcasts verwendet und durchlaufen habe, aber ich weiß immer noch nicht, wie ich diese Art von Transformation auf einem iPhone erstellen kann.
Jede Hilfe, Hinweise oder Beispielcode-Schnipsel wäre wirklich dankbar!
ios
cocoa-touch
uiview
core-animation
calayer
Nick Cartwright
quelle
quelle
Antworten:
Wie Ben sagte, müssen Sie mit der
UIView's
Ebene arbeiten und a verwendenCATransform3D
, um die auszuführenlayer's
rotation
. Der Trick, um die Perspektive zum Laufen zu bringen, wie hier beschrieben , besteht darin, direkt auf eine der Matrixcells
vonCATransform3D
(m34) zuzugreifen. Matrixmathematik war noch nie mein Ding, daher kann ich nicht genau erklären, warum dies funktioniert, aber es funktioniert. Sie müssen diesen Wert für Ihre anfängliche Transformation auf einen negativen Bruch setzen und dann Ihre Ebenenrotationstransformationen darauf anwenden. Sie sollten auch in der Lage sein, Folgendes zu tun:Ziel c
Swift 5.0
Dadurch wird die Ebenentransformation für jede Drehung von Grund auf neu erstellt.
Ein vollständiges Beispiel hierfür (mit Code) finden Sie hier , wo ich eine berührungsbasierte Rotation und Skalierung für einige implementiert habe
CALayers
, basierend auf einem Beispiel von Bill Dudney. Die neueste Version des Programms ganz unten auf der Seite implementiert diese Art der perspektivischen Operation. Der Code sollte relativ einfach zu lesen sein.Das
sublayerTransform
, auf das Sie sich in Ihrer Antwort beziehen, ist eine Transformation, die auf die Unterschichten von Ihnen angewendet wirdUIView's
CALayer
. Wenn Sie keine Unterschichten haben, machen Sie sich darüber keine Sorgen. Ich verwende die sublayerTransform in meinem Beispiel einfach, weilCALayers
in einer Ebene, die ich drehe, zwei enthalten sind .quelle
Sie können nur Core Graphics-Transformationen (nur Quarz, 2D) verwenden, die direkt auf die Transformationseigenschaft eines UIView angewendet werden. Um die Effekte im Coverflow zu erzielen, müssen Sie CATransform3D verwenden, die im 3D-Bereich angewendet werden, damit Sie die gewünschte perspektivische Ansicht erhalten. Sie können CATransform3Ds nur auf Ebenen anwenden, nicht auf Ansichten. Daher müssen Sie dazu zu Ebenen wechseln.
Schauen Sie sich das mit Xcode gelieferte Beispiel "CovertFlow" an. Es ist nur für Mac (dh nicht für iPhone), aber viele der Konzepte lassen sich gut übertragen.
quelle
Um Brads Antwort zu ergänzen und ein konkretes Beispiel zu liefern, leihe ich mir meine eigene Antwort in einem anderen Beitrag zu einem ähnlichen Thema aus. In meiner Antwort habe ich einen einfachen Swift-Spielplatz erstellt, den Sie herunterladen und spielen können. Dort zeige ich, wie perspektivische Effekte einer UIView mit einer einfachen Hierarchie von Ebenen erstellt werden, und ich zeige unterschiedliche Ergebnisse zwischen der Verwendung von
transform
undsublayerTransform
. Hör zu.Hier sind einige Bilder aus dem Beitrag:
quelle
Mit dem iCarousel SDK können Sie einen genauen Karusselleffekt erzielen.
Mit der wunderbaren und kostenlosen iCarousel-Bibliothek können Sie unter iOS einen sofortigen Cover Flow-Effekt erzielen. Sie können es von https://github.com/nicklockwood/iCarousel herunterladen und ganz einfach in Ihr Xcode-Projekt einfügen, indem Sie einen Bridging-Header hinzufügen (geschrieben in Objective-C).
Wenn Sie einem Swift-Projekt noch keinen Objective-C-Code hinzugefügt haben, gehen Sie folgendermaßen vor:
Swift 3-Beispielcode:
quelle