1

我正在尝试使用以下代码对我的 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;

这种工作,但它只转换 myView 上的子视图,而不是 myView 本身。

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

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

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

问题是我不想要动画。

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

谢谢!

4

2 回答 2

0

您应该可以只使用 myView.transform = CGAffineTransformMakeRotation(angle)。除非您明确告诉它使用 [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 文档:

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

于 2013-09-18T16:56:18.967 回答
0

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

于 2013-09-20T18:15:35.383 回答