我试图在使用核心动画时淡化几个视图。一切都没问题,直到第4或第5个视图消失。动画停止,几秒钟之后其余的视图就被放到屏幕上(没有动画发生)。我在第3代iPad上进行了测试,因此它不能成为过时硬件的问题。代码:
viewDidLoad中
- (void)viewDidLoad {
[super viewDidLoad];
self.subViews = self.view.subviews;
for (UIView *view in self.subViews) {
view.backgroundColor = [UIColor clearColor];
PhotoFrame *photoFrame = [[PhotoFrame alloc] init];
photoFrame.photo.image = [UIImage imageNamed:[NSString stringWithFormat:@"test%d.jpg", arc4random() % 6 + 1]];
[view addSubview:photoFrame];
view.layer.opacity = 0;
}
}
viewDidAppear
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self startAnimations];
}
startAnimations
- (void)startAnimations {
int count = 1;
for (UIView *view in self.subViews) {
CALayer *animationLayer = view.layer;
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.fromValue = @0.0;
animation.toValue = @1.0;
animation.duration = 0.3;
animation.beginTime = CACurrentMediaTime() + count * 0.3;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
[animationLayer addAnimation:animation forKey:@"opacityAnimation"];
count++;
}
}
我希望有人能帮助我。
答案 0 :(得分:1)
我建议您切换到UIView动画方法,例如animateWithDuration:animations:
,或者在提交动画时将属性设置为结束值,而不是使用removedOnCompletion = TRUE
。
正如我在上面的评论中所说,removedOnCompletion实际上导致动画保持活动状态,并应用于每个渲染帧。我发现当有很多动画活动时,事情会变慢。
答案 1 :(得分:0)
为什么不使用UIView animateWithDuration?
它也会淡化你的观点,我从来没有遇到任何问题。
答案 2 :(得分:0)
您可以尝试在CATransaction
中执行所有动画以将它们一起批处理,或者您可以将它们全部添加到公共容器视图中,并仅设置容器视图的不透明度的动画。由于视图不需要在动画期间重绘,您还可以使用shouldRasterize = YES;
所有这些事情可能会或可能不会影响性能,rasterizertion甚至可能会使某些情况更糟。
此外,如果涉及阴影,您应该真正为每个阴影设置阴影路径,因为这会在涉及阴影时大大提高性能。