Como Ben disse, você precisará trabalhar com a UIView's
camada, usando a CATransform3D
para executar a layer's
rotation
. O truque para fazer funcionar a perspectiva, como descrito aqui , é acessar diretamente uma das matrizes cells
da CATransform3D
(m34). A matemática matricial nunca foi minha coisa, então não posso explicar exatamente por que isso funciona, mas funciona. Você precisará definir esse valor como uma fração negativa para sua transformação inicial e aplicar as transformações de rotação da camada a isso. Você também deve poder fazer o seguinte:
Objetivo-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
}
que reconstrói a transformação da camada do zero para cada rotação.
Um exemplo completo disso (com código) pode ser encontrado aqui , onde eu implementei a rotação e o dimensionamento baseados em toque em alguns CALayers
, com base em um exemplo de Bill Dudney. A versão mais recente do programa, na parte inferior da página, implementa esse tipo de operação em perspectiva. O código deve ser razoavelmente simples de ler.
A que sublayerTransform
você se refere na sua resposta é uma transformação aplicada às subcamadas da sua UIView's
CALayer
. Se você não possui subcamadas, não se preocupe. Eu uso o sublayerTransform no meu exemplo, simplesmente porque existem dois CALayers
contidos na camada que estou girando.