我有一个简单的动画视图方法。
-(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后,错误消失了。
答案 0 :(得分:6)
你有三个动画:
position
transform
frame
设置动画,然后为position
设置动画。动画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动画之间一点点差异的问题。 在大多数情况下,它被打破了:
我很确定在有问题的视图上没有同步动画。 Autolayout和约束建议没有帮助(此外,所有动画视图都是在代码中创建的,因为即使在iOS8之前,autolayout也会干扰很多动画)。
这两个问题的通用解决方案是将有问题的视图放入包装器视图中并使用它来拆分旋转动画或执行导致重置'影响。现在它在7.1.1和8.1.1中的功能相同。