我正在编写一个应用程序,以便可以使用手势在屏幕上旋转、调整大小和平移 Sprite (UIImageView
的子类)。我还希望能够对 Sprite 应用 3D 透视变换。
我有旋转/调整大小/平移功能正常工作,以及透视变换。但是,它们似乎无法正确协同工作。如果我旋转一个未修改的 Sprite ,然后尝试倾斜它, Sprite “重置”它的旋转,然后应用透视。相反的工作;如果我先倾斜,我可以在不重置后应用任何 2D 转换。
这是我正在使用的代码:(旋转、调整大小和平移使用 UIGestureRecognizers
完成,而 skew 使用 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;
}
谢谢!
最佳答案
通过大量调试和this问题的帮助找到了答案。诀窍是使用以下方法转换 View 的视角:spriteView.superview.layer.sublayerTransform = transform;
这递归地将转换应用于 View 的超 View 和其中包含的任何 subview 。有关这方面的更多信息,请查看 documentation 和 Apple 的 Layer Style Properties guide。
关于ios - 将 UIView 透视变换与其他 CATranform3D 结合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24372464/