Chcę wykonać transformację perspektywy na UIView (np. Widoczne w coverflow)
Czy ktoś wie, czy jest to możliwe?
Badałem użycie CALayer
i przeglądałem wszystkie pragmatyczne podcasty programisty Core Animation, ale nadal nie jestem pewien, jak stworzyć taką transformację na iPhonie.
Każda pomoc, wskaźniki lub przykładowe fragmenty kodu byłyby bardzo mile widziane!
ios
cocoa-touch
uiview
core-animation
calayer
Nick Cartwright
źródło
źródło
Odpowiedzi:
Jak powiedział Ben, będziesz musiał pracować z
UIView's
warstwą, używającCATransform3D
do wykonanialayer's
rotation
. Sztuką dostać perspektywiczny działa, jak opisano tutaj , ma bezpośredni dostęp do jednego z matrycącells
oCATransform3D
(M34). Matematyka matematyczna nigdy nie była moją rzeczą, więc nie mogę dokładnie wyjaśnić, dlaczego to działa, ale działa. Musisz ustawić tę wartość na wartość ujemną dla początkowej transformacji, a następnie zastosować do tego transformacje obrotu warstw. Powinieneś być również w stanie wykonać następujące czynności:Cel C
Swift 5.0
który odbudowuje transformację warstwy od zera dla każdego obrotu.
Pełny przykład tego (z kodem) można znaleźć tutaj , gdzie zaimplementowałem rotację dotykową i skalowanie na kilku
CALayers
, na podstawie przykładu Billa Dudneya. Najnowsza wersja programu, znajdująca się na samym dole strony, implementuje tego rodzaju operacje perspektywiczne. Kod powinien być w miarę łatwy do odczytania.sublayerTransform
Odnieść w swojej odpowiedzi to przekształcać, który jest stosowany do podwarstwy twoichUIView's
CALayer
. Jeśli nie masz podwarstw, nie przejmuj się tym. Używam sublayerTransform w moim przykładzie po prostu dlatego, że są dwieCALayers
zawarte w jednej warstwie, którą obracam.źródło
Można używać tylko transformacji Core Graphics (tylko kwarc, 2D) bezpośrednio zastosowanych do właściwości transformacji UIView. Aby uzyskać efekty w ukryciu okładki, musisz użyć CATransform3D, które są stosowane w przestrzeni 3D, dzięki czemu możesz uzyskać pożądany widok perspektywiczny. Możesz zastosować CATransform3Ds tylko do warstw, a nie widoków, więc w tym celu musisz przełączyć się na warstwy.
Sprawdź próbkę „CovertFlow” dostarczoną z Xcode. Jest to tylko Mac (tj. Nie dla iPhone'a), ale wiele koncepcji dobrze się przenosi.
źródło
Aby dodać do odpowiedzi Brada i podać konkretny przykład, pożyczam od własnej odpowiedzi w innym poście na podobny temat. W mojej odpowiedzi utworzyłem prosty plac zabaw Swift, z którego można pobierać i bawić się , gdzie demonstruję, jak tworzyć perspektywiczne efekty UIView za pomocą prostej hierarchii warstw, i pokazuję różne wyniki między używaniem
transform
asublayerTransform
. Sprawdź to.Oto niektóre zdjęcia z posta:
źródło
Dokładny efekt karuzeli można uzyskać za pomocą iCarousel SDK.
Możesz uzyskać natychmiastowy efekt Cover Flow na iOS, korzystając ze wspaniałej i bezpłatnej biblioteki iCarousel. Możesz go pobrać ze strony https://github.com/nicklockwood/iCarousel i dość łatwo upuścić do projektu Xcode, dodając nagłówek pomostowy (napisany w Objective-C).
Jeśli nie dodałeś wcześniej kodu Objective-C do projektu Swift, wykonaj następujące kroki:
Przykładowy kod Swift 3:
źródło