iOS 8动画Bug

22

我有一个简单的方法来为视图添加动画效果。

-(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后,错误消失了。


frame 属性改为 center 属性无效。@user3386109 - Oleg Sobolev
1
这可能是因为您启用了自动布局。不是错误。 - Fogmeister
4个回答

6
您有三个动画:
  1. 您可以使图层的 position 动起来
  2. 您可以使图层的 transform 动起来
  3. 您可以使视图的 frame 动起来,进而使图层的 position 动起来。
动画 1 和 3 会发生冲突。
  • iOS 7 上的行为是,动画 3 会取消动画 1。
  • iOS 8 上的行为是,动画 1 和 3 同时运行("Additive Animations")。
我建议您删除动画 1,并查看相关的WWDC 2014视频(我认为它是“Building Interruptible and Responsive Interactions”)。

感谢您的澄清。 - Oleg Sobolev

4

对我而言有效的方法是在执行动画之前,禁用视图和子视图上的自动布局。仅从故事板中禁用自动布局在iOS8中不够。

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

2

这个例子可能会对您有所帮助,我希望在浪费数小时之前就发现它。与其动画化frame,不如动画化constraints。点击您想要调整的自动布局约束(例如在界面构建器中的顶部约束),然后将其设置为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];
}];

这是我最初发布的帖子

在您的示例中,您需要调整self.view.frame的约束。


0

我也遇到了iOS7和iOS8动画之间的一些小问题。

在大多数情况下,它要么是:

  • 缩放、变换和旋转CGAffineTransforms的单个组合 - 结果取决于iOS版本
  • 或者是不同视图上的复杂动画序列 - 一些视图在开始新的动画片段之前会“重置”它们的位置。约有5%的动画片段受到影响。

我很确定这些有问题的视图上没有同时进行的动画。

自动布局和约束建议没有帮助(而且,在iOS8之前,所有动画视图都是在代码中创建的,因为自动布局会干扰动画)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接