2010-12-14 14 views
12

Tworzę aplikację na iPada i chcę aktualizować użytkownika bieżącym rozmiarem widoku. Robiłem to przez obliczanie skali CGAffineTransform i mnożenie xScale przez szerokość (odnośnego widoku) i yScale przez wysokość. Chciałbym to kontynuować, ale nie robię już transformacji 2d i jestem pewien, jakiego równania użyć, aby wyodrębnić informacje o skali z CATransform3D.Uzyskiwanie "skali" z CATransform3D

Czy możesz pomóc?

Odpowiedz

19

Aby uzyskać aktualną skalę warstwy po prostu wykonać valueForKeyPath: na warstwie:

CGFloat currentScale = [[layer valueForKeyPath: @"transform.scale"] floatValue]; 

Inne klawisze można znaleźć w Apples Core Animation Programming Guide

+0

To było wspaniałe! Powinna to być zatwierdzona odpowiedź. – Collin

+0

bardzo przydatne :) Tks dużo! – TonyMkenu

+0

Zabawne, zawsze zwraca zero [[self presentationLayer] valueForKey: @ "transform.scale"] – Andy

8

Nie jestem zaznajomiony z API, ale CATransform3D wygląda jak zwykła macierz transformacji 4x4 do wykonywania transformacji 3D.

Przyjmując, że reprezentuje ona jedynie kombinację skali, obrotu i translacji, współczynniki skali można wyodrębnić, obliczając wartości rzędów lub kolumn lewego górnego rogu 3x3 w zależności od tego, czy CATransform3D jest rzędem, czy kolumną odpowiednio.

Na przykład, jeśli jest to wiersz-dur, skala w kierunku x jest pierwiastkiem kwadratowym z (m11 * m11) + (m12 * m12) + (m13 * m13). Skale y i z będą podobnie wielkościami drugiego i trzeciego rzędu.

Z dokumentacji dla CATransform3DMakeTranslation wynika, że ​​CATransform3D jest rzeczywiście wiersz-większy.