【问题标题】:Combining a UIView perspective transform with other CATranform3Ds将 UIView 透视变换与其他 CATransform3D 相结合
【发布时间】:2014-08-13 21:06:14
【问题描述】:

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    spriteView.superview.layer.sublayerTransform = transform;

    这递归地将转换应用到视图的父视图和其中包含的任何子视图。有关这方面的更多信息,请查看 documentation 和 Apple 的 Layer Style Properties guide

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 2016-05-03
      • 1970-01-01
      相关资源
      最近更新 更多