【问题标题】:iOS 8 animation bugiOS 8 动画错误
【发布时间】:2014-06-29 02:31:24
【问题描述】:

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

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

【问题讨论】:

  • 移动 center 属性而不是 frame 不起作用。 @user3386109
  • 这可能是因为您启用了自动布局。不是错误。

标签: ios8 cabasicanimation


【解决方案1】:

你有三个动画:

  1. 您为图层的position 设置动画
  2. 您为图层的transform 设置动画
  3. 您为视图的frame 设置动画,而该视图的position 又为该层的position 设置动画。

动画 1 和 3 发生碰撞。

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

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

【讨论】:

  • 感谢您的澄清。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这个例子可能会对你有所帮助,我希望在浪费时间之前发现它。与其为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 的约束。

    【讨论】:

      【解决方案4】:

      我还遇到了 iOS7 和 iOS8 动画之间存在细微差别的问题。 在大多数情况下,它被破坏了:

      • Scale、Transform 和 Rotate CGAffineTransforms 的单一组合 - 结果取决于 iOS 版本
      • 或不同视图上的复杂动画序列 - 一些视图在开始一段新动画之前会“重置”它们的位置。大约 5% 的动画作品受到影响。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-19
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多