0

我在特定位置有一个按钮(实际上是四个),我想同时旋转和平移,因此我选择使用 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];
4

2 回答 2

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 启用并学习如何为约束设置动画。

对于第二个选项,我可以推荐 Ray Wenderlich 和他的团队所著的《iOS6 by Tutorials》一书。

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

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

于 2013-09-17T14:35:15.790 回答
2

您可以从其中一种转换开始,比如说翻译:

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

然后为其添加旋转:

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

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

于 2013-09-17T14:38:52.993 回答