将UIView透视变换与其他CATranform3D组合在一起

时间:2014-06-23 18:04:54

标签: ios objective-c cocoa-touch uiview core-animation

我正在编写一个应用程序,以便可以使用手势在屏幕上旋转,调整大小和平移精灵(UIImageView的子类)。我也希望能够对精灵应用3D透视变换。

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

以下是我正在使用的代码:(使用UIGestureRecognizers完成旋转,调整大小和平移,而倾斜使用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;
}

谢谢!

1 个答案:

答案 0 :(得分:1)

通过大量调试和this问题的帮助找到了答案。诀窍是使用以下方法改变观点的视角:

spriteView.superview.layer.sublayerTransform = transform;

这会递归地将转换应用于视图的超级视图以及其中包含的任何子视图。有关此问题的详情,请查看documentation和Apple的Layer Style Properties guide