Как сказал Бен, вам нужно работать со UIView's
слоем, используя CATransform3D
для выполнения layer's
rotation
. Хитрость , чтобы получить перспективную работу, так как описано здесь , является непосредственно доступ к одному из матрицы cells
из CATransform3D
(m34). Математическая математика никогда не была моей вещью, поэтому я не могу точно объяснить, почему это работает, но это работает. Вам нужно будет установить это значение в отрицательную дробь для вашего первоначального преобразования, а затем применить к нему преобразования вращения слоя. Вы также должны быть в состоянии сделать следующее:
Objective-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
}
который восстанавливает слой преобразования с нуля для каждого поворота.
Полный пример этого (с кодом) можно найти здесь , где я реализовал ротацию на основе касания и масштабирование для пары на CALayers
основе примера Билла Дадни. В самой последней версии программы, в самом низу страницы, реализована такая перспективная операция. Код должен быть достаточно простым для чтения.
sublayerTransform
Вы ссылаетесь в вашем ответе есть преобразование , которое применяется к подслоя из ваших UIView's
CALayer
. Если у вас нет подслоев, не беспокойтесь об этом. Я использую sublayerTransform в моем примере просто потому, что CALayers
в одном слое, который я вращаю, содержатся два элемента.