UIView动画一开始就跳了起来

Fog*_*ter 28 objective-c uiviewanimation ios

我正在运行此代码......

[UIView animateWithDuration:0.2
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{

                     CGAffineTransform settingsTransform = CGAffineTransformMakeTranslation(self.settingsView.frame.size.width, 0);
                     CGAffineTransform speedTransform = CGAffineTransformMakeTranslation(-self.speedView.frame.size.width, 0);

                     self.settingsView.transform = settingsTransform;
                     self.speedView.transform = speedTransform;

                 } completion:nil];
Run Code Online (Sandbox Code Playgroud)

但是当它运行时,视图会在相反方向上跳转一半,然后在正确的方向上滑动到半个位置.

我已经将动画持续时间减慢到5秒,但是初始跳跃是瞬时的,一半的转换是错误的方向.

当我使用此代码动画回来时......

[UIView animateWithDuration:0.2
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     self.settingsView.transform = CGAffineTransformIdentity;
                     self.speedView.transform = CGAffineTransformIdentity;
                 } completion:nil];
Run Code Online (Sandbox Code Playgroud)

它完全一样.

结果是最终运动是所需变换的一半,因为它首先在错误的方向上跳过一半变换.

我真的无法理解为什么会这样?

有任何想法吗.

::编辑::

清除一些可能的歧义.

我并不是试图将这些观点"反弹"回到原来的位置.我正在制作动画的视图就像屏幕边缘的控制面板.当用户按下"go"时,视图会滑出.当用户按下"停止"时,面板滑回视图.

至少他们习惯了.由于启用了自动布局(我需要应用程序的其他部分),我不能只改变视图的框架,所以我去了转换路径.

您可以通过将视图粘贴到视图控制器和运行动画的按钮来查看此效果.

谢谢

小智 67

我有完全相同的问题所以这里是我提出的解决方案.

    CGAffineTransform transform = CGAffineTransformMake(1, 0, 0, 1, translation.x, translation.y);
    [UIView animateWithDuration:0.25 animations:^{
        _assetImageView.transform = transform;
        [self.view layoutIfNeeded];
    } completion:^(BOOL finished) {
    }];
Run Code Online (Sandbox Code Playgroud)

所以我打电话给[self.view layoutIfNeeded]; 在动画块内.如果没有它,它会遇到与你相同的问题并首先跳远距离负转换,然后从那里动画到正确的位置.我从视图控制器调用它,所以self是UIViewController的子类.在你的情况下,"self.view"可能不存在,但我希望你能得到这个想法.

  • 哇这是一个完美无缺的随机解决方案!知道为什么会这样吗? (2认同)

And*_*lla 15

这里的解决方案都不适用于我...我的动画总会跳过.(除非在另一个动画结束时它是正确的,提示).

一些细节:

正在执行此操作的视图具有一系列比例并已在堆栈中进行转换.

解:

使用超短的第一个键进行关键帧动画,该第一个键基本上会重新应用上一个动画应该设置的变换.

    UIView.animateKeyframesWithDuration(0.4, delay: 0.0, options: [.CalculationModeCubic], animations: { () -> Void in
        //reset start point
        UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.01, animations: { () -> Void in
            self.element.transform = initialTransform
        })

        UIView.addKeyframeWithRelativeStartTime(0.01, relativeDuration: 0.99, animations: { () -> Void in
            self.element.transform = finalTransform
        })
    }, completion: nil)
Run Code Online (Sandbox Code Playgroud)


Fog*_*ter 8

好的,再次观看了WWDC视频后,他们声明使用AutoLayout时要做的第一件事就是删除对setFrame的任何调用.

由于屏幕的复杂性,我完全删除了自动布局,现在我正在使用框架位置来移动屏幕周围的视图.

谢谢

  • 禁用自动布局修复了我的问题.谢谢. (2认同)

den*_*bec 8

我已经向Apple技术支持部门询问了这个问题并得到了这个回复,所以这是一个错误.

iOS 8目前在UIKit动画中展示了一个已知的错误,其中变换动画从错误中得到了错误(主要影响动画对象的位置,使它们在动画开始时出现意外"跳跃").

[...]

在提供潜在修复之前的解决方法是下拉到Core Animation API来编码动画.