将变换应用于UIView本身

时间:2013-09-18 15:52:18

标签: ios objective-c uiview calayer catransform3d

我正在尝试使用以下代码将透视变换应用于我的UIView对象:

CATransform3D t = CATransform3DIdentity;
t.m34 = -1.0/1000;
t = CATransform3DRotate(t, angle, 0.0f, 1.0f, 0.0f);

myView.layer.transform = t;

我根本没有看到任何效果。我尝试过其他变换,例如简单的翻译,但它们也不起作用。

但是,如果我执行以下两项修改中的任何一项,那么它会稍微有效但不满足我的要求:

  1. 将最后一行更改为

    myView.layer.sublayerTransform = t;

  2. 这种方法有效,但它只会转换myView上的子视图,而不是myView本身。

    1. 添加动画代码以应用更改,而不是直接将更改分配给图层:

      CABasicAnimation * turningAnimation = [CABasicAnimation animationWithKeyPath:@“transform”]; turningAnimation.toValue = [NSValue valueWithCATransform3D:t]; turningAnimation.delegate = self; turningAnimation.fillMode = kCAFillModeForwards; turningAnimation.removedOnCompletion = NO;

      [myView.layer addAnimation:turningAnimation forKey:@“turning”];

    2. 问题是我不想要动画。

      有人可以为我指明方向吗?

      谢谢!

2 个答案:

答案 0 :(得分:0)

你应该能够使用myView.transform = CGAffineTransformMakeRotation(角度)。除非您明确告诉它使用[UIView animateWithDuration:],否则它不会为属性设置动画。使用UIView转换属性最终会将您的转换应用于支持UIView的CALayer,因此我确保只在一个级别(UIView或CALayer)上与转换进行交互。

UIView转换文档: https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/instp/UIView/transform

CGAffineTransform Doc:

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/Reference/reference.html#//apple_ref/c/func/CGAffineTransformMakeRotation

答案 1 :(得分:0)

我在Krishnan测试后发现问题确定了layer.transform本身在没有动画或sublayerTransform的帮助下工作。我遇到的问题是由已应用于我的视图图层但后来未删除的动画引起的。由于这个动画的toValue等于身份变换,我没有意识到它实际上可以阻止后续的非动画变换工作。在动画上设置removedOnCompletion = YES(这是默认设置)解开了谜团。