Seperti kata Ben, Anda harus bekerja dengan UIView's
layer, menggunakan a CATransform3D
untuk melakukan layer's
rotation
. Trik untuk mendapatkan perspektif kerja, seperti yang dijelaskan di sini , adalah untuk langsung akses salah satu matriks cells
dari CATransform3D
(m34). Matriks matematika tidak pernah menjadi tujuan saya, jadi saya tidak dapat menjelaskan dengan tepat mengapa ini berhasil, tetapi ternyata demikian. Anda harus mengatur nilai ini ke fraksi negatif untuk transformasi awal Anda, lalu menerapkan transformasi rotasi layer Anda ke sana. Anda juga harus dapat melakukan hal berikut:
Objektif-C
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;
Swift 5.0
if let myView = self.subviews.first {
let layer = myView.layer
var rotationAndPerspectiveTransform = CATransform3DIdentity
rotationAndPerspectiveTransform.m34 = 1.0 / -500
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0 * .pi / 180.0, 0.0, 1.0, 0.0)
layer.transform = rotationAndPerspectiveTransform
}
yang membangun kembali transformasi lapisan dari awal untuk setiap rotasi.
Contoh lengkap dari ini (dengan kode) dapat ditemukan di sini , di mana saya telah menerapkan rotasi berbasis sentuhan dan penskalaan pada beberapa CALayers
, berdasarkan contoh oleh Bill Dudney. Versi terbaru dari program, di bagian paling bawah halaman, mengimplementasikan operasi perspektif semacam ini. Kode harus cukup sederhana untuk dibaca.
Yang sublayerTransform
Anda rujuk dalam respons Anda adalah transformasi yang diterapkan ke sublapisan Anda UIView's
CALayer
. Jika Anda tidak memiliki sublayer, jangan khawatir tentang hal itu. Saya menggunakan sublayerTransform dalam contoh saya hanya karena ada dua yang CALayers
terkandung dalam satu lapisan yang saya putar.