Ios 将UIView透视变换与其他CATranform3Ds组合
我正在编写一个应用程序,这样sprite(UIImageView的子类)可以通过手势在屏幕上旋转、调整大小和平移。我还希望能够将3D透视变换应用于精灵 我有旋转/调整大小/平移功能,以及透视变换。然而,它们似乎不能正确地协同工作。如果我旋转一个未修改的精灵,然后尝试倾斜它,精灵“重置”它的旋转,然后应用透视图。然而,情况正好相反;如果我先倾斜,我可以在不重置的情况下应用任何2D变换 下面是我正在使用的代码:(旋转、调整大小和平移是使用Ios 将UIView透视变换与其他CATranform3Ds组合,ios,objective-c,cocoa-touch,uiview,core-animation,Ios,Objective C,Cocoa Touch,Uiview,Core Animation,我正在编写一个应用程序,这样sprite(UIImageView的子类)可以通过手势在屏幕上旋转、调整大小和平移。我还希望能够将3D透视变换应用于精灵 我有旋转/调整大小/平移功能,以及透视变换。然而,它们似乎不能正确地协同工作。如果我旋转一个未修改的精灵,然后尝试倾斜它,精灵“重置”它的旋转,然后应用透视图。然而,情况正好相反;如果我先倾斜,我可以在不重置的情况下应用任何2D变换 下面是我正在使用的代码:(旋转、调整大小和平移是使用UIgestureRecognitors完成的,而倾斜使用UI
UIgestureRecognitors
完成的,而倾斜使用UISlider
)
轮换:
- (void)didRotateSprite:(UIRotationGestureRecognizer *)rotate
{
CGFloat angle = rotate.rotation;
CATransform3D transform = CATransform3DIdentity;
transform = CATransform3DRotate(spriteView.layer.transform, angle, 0, 0, 1);
spriteView.layer.transform = transform;
rotate.rotation = 0.0;
}
调整大小:
- (void)didPinchSprite:(UIPinchGestureRecognizer *)pinch
{
CGFloat scale = pinch.scale;
CATransform3D transform = CATransform3DIdentity;
transform = CATransform3DScale(spriteView.layer.transform, scale, scale, 1);
view.layer.transform = transform;
pinch.scale = 1.0;
}
透视图:
- (IBAction)perspectiveChanged:(UISlider *)slider
{
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0 / -100;
transform = CATransform3DRotate(transform, (1 - (slider.value * 2)) * M_PI_2, 1, 0, 0);
spriteView.layer.transform = transform;
}
谢谢大家! 通过大量调试和问题的帮助找到了答案。诀窍是使用以下方法变换视图的透视图:
spriteView.superview.layer.sublayerttransform=transform代码>
这将递归地将转换应用于视图的superview及其包含的任何子视图。有关这方面的更多信息,请查看和苹果的