iOS 8动画bug

时间:2014-06-29 02:31:25

标签: ios8 cabasicanimation

我有一个简单的动画视图方法。

-(void)animateSelf
{
    CABasicAnimation * animation;

    animation = [CABasicAnimation animationWithKeyPath:@"position.y"];
    // settings ...
    [self.view.layer addAnimation:animation forKey:@"position.y"];

    animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    // settings ...
    [self.view.layer addAnimation:animation forKey:@"transform.rotation.z"];

    [UIView animateWithDuration: 1.0 animations:^{
        CGRect rect = self.view.frame;
        rect.origin.y += 800;
        self.view.frame = rect;
    } completion:nil];
}

对于iOS 7,它运作良好。但对于iOS 8,动画表现不可预测。有没有办法将这些动画组合成iOS 8?

我尝试用另一个CABasicAnimation替换animateWithDuration:但它没有帮助。 view.frame日志是正确的,但view.frame的动画跳出了不明原点。

删除position.y(第一个)的CABasicAnimation后,错误消失了。

4 个答案:

答案 0 :(得分:6)

你有三个动画:

  1. 您为图层的position
  2. 设置动画
  3. 您为图层的transform
  4. 设置动画
  5. 您可以为视图的frame设置动画,然后为position设置动画。
  6. 动画1和3发生碰撞。

    • 在iOS 7上,行为是动画3取消动画1。
    • 在iOS 8上,行为是动画1和3同时运行(“添加动画”)。

    我建议您删除动画1并查看相关的WWDC 2014视频(我认为是Building Interruptible and Responsive Interactions)。

答案 1 :(得分:4)

对我来说有用的是禁用视图上的自动布局和我在制作动画之前在某个时刻制作动画的视图的SUBVIEWS。在iOS8中禁用故事板中的自动布局是不够的。

[viewToAnimate removeFromSuperview];
[viewToAnimate setTranslatesAutoresizingMaskIntoConstraints:YES];
//addSubview again at original index
[superView insertSubview:viewToAnimate atIndex:index];

答案 2 :(得分:2)

这个例子可能对你有帮助,我希望在浪费时间之前我已经发现了它。而不是为frame设置动画,而是为其contraints设置动画。单击要调整的自动布局约束(在界面构建器中,例如顶部约束)。接下来让它成为IBOutlet;

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;

向上动画;

self.topConstraint.constant = -100;    
[self.viewToAnimate setNeedsUpdateConstraints]; 
[UIView animateWithDuration:1.5 animations:^{
    [self.viewToAnimate layoutIfNeeded]; 
}];

动画回原始地方

self.topConstraint.constant = 0;    
[self.viewToAnimate setNeedsUpdateConstraints];  
[UIView animateWithDuration:1.5 animations:^{
    [self.viewToAnimate layoutIfNeeded];
}];

最初由我发布here

因此,您可以在示例中调整self.view.frame的约束。

答案 3 :(得分:0)

我还遇到了iOS7和iOS8动画之间一点点差异的问题。 在大多数情况下,它被打破了:

  • Scale,Transform和Rotate CGAffineTransforms的单一组合 - 结果取决于iOS版本
  • 或不同视图中复杂的动画序列 - 某些观看次数正在重置'在开始新的动画之前他们的位置。大约5%的动画片受到影响。

我很确定在有问题的视图上没有同步动画。 Autolayout和约束建议没有帮助(此外,所有动画视图都是在代码中创建的,因为即使在iOS8之前,autolayout也会干扰很多动画)。

这两个问题的通用解决方案是将有问题的视图放入包装器视图中并使用它来拆分旋转动画或执行导致重置'影响。现在它在7.1.1和8.1.1中的功能相同。