我正在编写一个应用程序,以便可以使用手势在屏幕上旋转、调整大小和平移 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/

10-14 22:06