Jak ubiegać się perspektywa przekształcić do UIView?

głosy
189

Szukam do wykonywania perspektywa przekształcić na UIView (takie jak widać na CoverFlow)

Czy anyonew wiem czy to jest możliwe?

Mam badano stosując CALayeri uruchomiony przez wszystkich podstawowych pragmatycznych programista podcastów animacji, ale nie jestem jeszcze wyraźniej na temat tworzenia tego rodzaju przekształcić na iPhone.

Każda pomoc, wskazówki lub fragmentów przykład kod będzie naprawdę doceniam!

Utwórz 07/12/2008 o 15:04
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
7

Można używać tylko rdzeń graficzny (Quartz 2D tylko) przekształca się bezpośrednio zastosować do przekształcenia własności UIView za. Aby uzyskać efekty w CoverFlow, będziesz musiał użyć CATransform3D, które są stosowane w przestrzeni 3-D, a więc może dać Ci widok perspektywiczny chcesz. Można zastosować tylko CATransform3Ds do warstw, a nie poglądów, więc będziesz musiał przejść na warstwach dla tego produktu.

Sprawdź „CovertFlow” próbka, która pochodzi z Xcode. To mac-only (czyli nie dla iPhone), ale wiele z koncepcji przeniesienia dobrze.

Odpowiedział 07/12/2008 o 16:43
źródło użytkownik

głosy
319

Jak powiedział Ben, trzeba pracować z warstwą UIView, wykorzystując do CATransform3D wykonać obrót warstwy. Sztuką dostać perspektywiczny działa, jak opisano tutaj , ma bezpośredni dostęp do jednej z komórek macierzy o CATransform3D (M34). Matrix matematyka nigdy nie była moja sprawa, więc nie mogę dokładnie wyjaśnić, dlaczego to działa, ale to robi. Musisz ustawić tę wartość ujemną frakcji dla początkowej transformacji, a następnie zastosować rotację warstwa przekształca się do tego. Należy również być w stanie wykonać następujące czynności:

UIView *myView = [[self subviews] objectAtIndex:0];
CALayer *layer = myView.layer;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
layer.transform = rotationAndPerspectiveTransform;

który odbudowuje warstwa przekształcić od zera do jednego obrotu.

Pełną tego przykładem (z kodem) można znaleźć tutaj , gdzie zostały wdrożone dotykowy obracanie i skalowanie oparte na kilku CALayers, oparte na przykład Bill Dudney. W najnowszej wersji programu, na samym dole strony, realizuje tego rodzaju operacji perspektywicznym. Kod powinien być w miarę proste do odczytania.

SublayerTransform odnieść w swojej odpowiedzi to przekształcać, który jest stosowany do podwarstw Twój UIView użytkownika CALayer. Jeśli nie masz żadnych podwarstwy, nie martw się o to. Używam sublayerTransform w moim przykładzie po prostu dlatego, że istnieją dwa CALayers zawartych w jednej warstwie, że jestem wirującym.

Odpowiedział 09/12/2008 o 16:44
źródło użytkownik

głosy
13

Bardzo, bardzo dobry artykuł na temat transformacji i perspektywy CALayer 3D, włącznie z dokładnym wyjaśnieniem polu M34, można znaleźć w tym znakomitym artykule:

Rdzeń animacja-3D model

Odpowiedział 21/07/2012 o 20:19
źródło użytkownik

głosy
3

Aby dodać odpowiedź Brada i dostarczyć konkretny przykład, mogę pożyczyć od własnej odpowiedzi w innym poście na podobny temat. W mojej odpowiedzi, stworzyłem prosty Swift zabaw, które można pobrać i grać z , gdzie mogę pokazać, jak tworzyć efekty perspektywiczne UIView z prostej hierarchii warstw, i pokazują różne wyniki między używaniem transforma sublayerTransform. Sprawdź to.

Oto niektóre z obrazów z postu:

opcja .sublayerTransform

opcja .transform

Odpowiedział 09/03/2017 o 23:24
źródło użytkownik

głosy
0

Można uzyskać dokładny efekt Karuzela korzystając iCarousel SDK.

Można uzyskać natychmiastowy efekt Cover Flow na iOS za pomocą wspaniałą i darmową bibliotekę iCarousel. Można go pobrać ze https://github.com/nicklockwood/iCarousel i upuść go do projektu Xcode dość łatwo poprzez dodanie nagłówka pomostową (nie jest to napisane w Objective-C).

Jeśli nie dodali kod Objective-C do Swift projektu przed, wykonaj następujące kroki:

  • Pobierz i rozpakuj go iCarousel
  • Przejdź do folderu, w którym rozpakowany, otworzy swój iCarousel podfolder, wybierz iCarousel.h i iCarousel.m i przeciągnąć je do nawigacji projektu - to lewe okienko w Xcode. Tuż poniżej Info.plist jest w porządku.
  • Check „Kopiuj pozycje w razie potrzeby”, a następnie kliknij przycisk Zakończ.
  • Xcode poprosi z komunikatem „Czy chcesz skonfigurować Objective-C pomostowych nagłówek?” Kliknij przycisk „Utwórz Bridging Nagłówek” powinien pojawić się nowy plik w projekcie o nazwie YourProjectName-Bridging-header.h.
  • Dodaj tę linię do pliku: #import „iCarousel.h”
  • Po dodaniu iCarousel do projektu można zacząć go używać.
  • Upewnij się, że są zgodne z obu protokołów iCarouselDelegate i iCarouselDataSource.

Swift Code 3 próbki:

    override func viewDidLoad() {
      super.viewDidLoad()
      let carousel = iCarousel(frame: CGRect(x: 0, y: 0, width: 300, height: 200))
      carousel.dataSource = self
      carousel.type = .coverFlow
      view.addSubview(carousel) 
    }

   func numberOfItems(in carousel: iCarousel) -> Int {
        return 10
    }

    func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView {
        let imageView: UIImageView

        if view != nil {
            imageView = view as! UIImageView
        } else {
            imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 128, height: 128))
        }

        imageView.image = UIImage(named: "example")

        return imageView
    }
Odpowiedział 21/12/2017 o 09:43
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more