Ios 将UIView透视变换与其他CATranform3Ds组合

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

我正在编写一个应用程序,这样sprite(UIImageView的子类)可以通过手势在屏幕上旋转、调整大小和平移。我还希望能够将3D透视变换应用于精灵

我有旋转/调整大小/平移功能,以及透视变换。然而,它们似乎不能正确地协同工作。如果我旋转一个未修改的精灵,然后尝试倾斜它,精灵“重置”它的旋转,然后应用透视图。然而,情况正好相反;如果我先倾斜,我可以在不重置的情况下应用任何2D变换

下面是我正在使用的代码:(旋转、调整大小和平移是使用
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及其包含的任何子视图。有关这方面的更多信息,请查看和苹果的