CATransition 动画在 iOS 中需要很长时间

Posted

技术标签:

【中文标题】CATransition 动画在 iOS 中需要很长时间【英文标题】:CATransition animation taking long time in iOS 【发布时间】:2018-03-20 05:14:57 【问题描述】:

我添加了动画来将一个控制器推送到另一个控制器。这是我的代码来推送视图。这个动画在 iPhone 5S 中需要 2 秒,在 iPhone 5 中需要 5 秒。我无法弄清楚究竟是什么问题.我想要这个动画 1 秒。这是我的代码。

 DetailVC *detailObj = [[DetailVC alloc] initWithNibName:@"DetailVC" bundle:nil];
 detailObj.dataGift = data;


        detailObj.view.transform =  CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);
        [UIView animateWithDuration:1.0
                         animations:^
                             CATransition* transition = [CATransition animation];
                             transition.duration = 0.75;
                             transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
                             transition.type = kCATransitionFade;
                             [self.navigationController.view.layer addAnimation:transition forKey:nil];
                            [self.navigationController pushViewController:detailObj animated:false];

                             detailObj.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0);
                          completion:^(BOOL finished) 

                         ];
      );

【问题讨论】:

你有一个块 [UIView animateWithDuration:1.0 和里面的 CATransition 占用 0.75 这应该是这个原因 @PrashantTukadiya 你能提供完整的代码吗?如果它有效,我可以投票 animateWithDuration: 正文中删除转换代码。这里不需要两个动画。 【参考方案1】:

您正在动画块内执行动画,因此您的持续时间会增加

将您的代码替换为

 DetailVC *detailObj = [[DetailVC alloc] initWithNibName:@"DetailVC" bundle:nil];
 detailObj.dataGift = data;
 detailObj.view.transform =  CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);


CATransition* transition = [CATransition animation];
transition.duration = 0.75;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
transition.type = kCATransitionFade;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.navigationController pushViewController:detailObj animated:false];

detailObj.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0);

并确保在主队列中执行该操作

希望对你有帮助

【讨论】:

你应该把它放在主线程中。你所有的 UI 都应该在主线程中 我认为 detailObj.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);您的答案中缺少 @KrutarthPatel 感谢您指出。将更新相关代码 @KrutarthPatel 替代解决方案将是一个转换委托一个很好的例子objc.io/issues/12-animations/…你可以自定义你的动画 感谢链接,但代码不工作。没有动画效果【参考方案2】:

问题出现在主详细信息屏幕中,viewdidload 中发生了繁重的任务。我逐行检查,在视图 didload 中评论每一行哪个活动需要更多时间。我将耗时的活动放在主线程中,我的问题得到了解决.

这是我的动画代码

 gameDetailObj.view.transform =  CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);
        [UIView animateWithDuration:1.0
                         animations:^

                             [self.navigationController pushViewControllerSafetly:gameDetailObj animated:NO];

                             gameDetailObj.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0);
                          completion:^(BOOL finished) 

                         ];

【讨论】:

以上是关于CATransition 动画在 iOS 中需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

iOS CoreAnimation 转场动画 CATransition

使用 CATransition 重新创建 iOS 应用打开过渡

iOS CoreAnimation 转场动画 CATransition

用于 segue 动画的 CATransition(iOS 7 之前的样式)

iOS CATransition动画实现SDWebImage图片下载完成渐变动画

iOS CATransition动画实现SDWebImage图片下载完成渐变动画