CGAffineTransformMake在转换之前移动我的对象

时间:2013-09-17 14:27:18

标签: objective-c animation

我在一个特定的位置有一个按钮(实际上有四个),我想同时旋转和平移,因此我选择使用CGAffineTransformMake并提供转换矩阵。

但是我注意到,如果我想翻译x = -100,例如,按钮将首先立即移动x = +200,然后将其转换为x = -100。

有没有办法让它翻译而不会向相反的方向转变?

CGAffineTransform transform = CGAffineTransformMake(-1, 0, 0, -1, -100, 0); // Spins 180° and translates

[UIView beginAnimations:@"Show Menu" context:nil];
[UIView setAnimationDuration:2.4];
_menuButton1.transform = transform;
[_menuButton1 setAlpha:1.0];
[UIView commitAnimations];

2 个答案:

答案 0 :(得分:2)

您不应该使用该动画方法。在iOS 4.0之后,Apple不鼓励它。 https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/clm/UIView/beginAnimations:context

首选方法是......

[UIView animateWithDelay:0.0
                duration:2.4
                 options:0
              animations:^() {
                  _menuButton1.transform = CGAffineTransformMake(-1, 0, 0, -1, -100, 0);
                  _menuButton1.alpha = 1.0;
              }
              completion:nil];

当你回复我的评论时,我会编辑我的答案。

好的,这种转变的原因是你试图在使用AutoLayout约束它时翻译视图。

我不知道它为什么会导致问题,但确实如此。

您修复它的两个选项是......

  1. 转动AutoLayout然后你的代码就可以了。
  2. 启用AutoLayout并了解如何设置约束动画。
  3. 对于第二种选择,我可以推荐Ray Wenderlich及其团队出版的“iOS6 by Tutorials”一书。

    http://www.raywenderlich.com/store/ios-6-by-tutorials

    我用它来学习如何正确地进行AutoLayout。

答案 1 :(得分:2)

你可以从其中一个变换开始,让我们说翻译:

CGAffineTransform transform = CGAffineTransformMakeTranslation(-100.0f, 0.0f);

然后添加旋转:

transform = CGAffineTransformRotate(transform, (float)M_PI_2);

最后将此变换设置为视图的transform属性。