Objective c 核心动画

Objective c 核心动画,objective-c,ios,ipad,core-animation,Objective C,Ios,Ipad,Core Animation,我试图在使用核心动画时淡入一些视图。在第四或第五视图消失之前,一切都正常。动画停止,几秒钟后,剩下的视图就显示在屏幕上(没有动画发生)。我在第三代iPad上测试了它,所以它不可能是过时硬件的问题。代码: viewDidLoad - (void)viewDidLoad { [super viewDidLoad]; self.subViews = self.view.subviews; for (UIView *view in self.subViews) {

我试图在使用核心动画时淡入一些视图。在第四或第五视图消失之前,一切都正常。动画停止,几秒钟后,剩下的视图就显示在屏幕上(没有动画发生)。我在第三代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;
    }
}
视图显示

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self 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++;
    }
}

我希望任何人都能帮助我。

为什么不使用UIView animateWithDuration


它也会在您的视图中淡出,我从来没有遇到过任何问题。

您可以尝试在一个容器中执行所有动画以将它们批处理在一起,或者您可以将它们全部添加到一个公共容器视图中,并且只对容器视图的不透明度设置动画。由于在动画过程中不需要重新绘制视图,因此也可以使用
shouldRasterize=YES

所有这些都可能影响性能,也可能不影响性能,光栅化在某些情况下甚至可能使性能变得更糟


此外,如果涉及阴影,您应该为每个阴影设置阴影路径,因为这将大大提高涉及阴影时的性能。

我建议切换到UIView动画方法,如
动画宽度:动画:
,或者在提交动画时将属性设置为其最终值,而不使用
removedOnCompletion=TRUE

正如我在上面的评论中所说,removedOnCompletion实际上会使动画保持活动状态,并应用于渲染的每个帧。我发现,当有很多动画处于活动状态时,事情会变慢。

这可能会使代码变短,但与性能无关。再想想,如果用于在单个动画块中批处理多个alpha动画,可能会提高性能。这还有另一个原因。当您将removedOnCompletion设置为NO并使用fillMode=kCAFillModeForwards时,系统实际上会保留所有动画层并使其处于活动状态,并将它们应用于渲染的每个帧。相比之下,UIView animateWithDuration:animations:方法将更改应用于基础属性,然后在完成时删除动画。我想您的意思是“不使用removedOnCompletion=FALSE”