OGeek|极客世界-中国程序员成长平台

标题: iphone - UINavigationController 推送过渡期间的低帧率 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 15:38
标题: iphone - UINavigationController 推送过渡期间的低帧率

我有一个 UINavigationController,并从 Root View Controller 推送到下一个 View Controller 。第二个 View Controller 相当“重”,因为它有大量的初始化和 subview 。

我的问题是:过渡动画的表现非常糟糕。基本上,动画的帧速率非常低(我从“推送”动画中总共获得了 3-4 帧)。

我尝试了多种不同的技术,包括两种不同的手动动画过渡方法。在所有情况下,动画的前 0.4-0.7 秒都会受到这种低帧率的影响。例如,如果我将过渡时间设置为 5 秒,那么前半秒左右的效果会很差,但动画的其余部分却很流畅。

这让我相信在过渡开始时“某事”正在发生——导致设备以非常低的帧速率进行动画处理。

在我的代码中注入(inject)大量 NSLog 语句后,我看到发生了两件事。首先,显然第二个 View 在推送期间被延迟加载。我通过在执行推送之前访问 view 属性上的 getter 来解决这个问题。我可以确认这会导致在推送动画开始之前发生所有初始化。

其次,我的应用在转换过程中大部分时间都会收到内存不足的警告。但是,即使在我没有收到内存警告的情况下,动画的表现仍然很差——这让我相信这些都不是原因。

我的问题:是否有其他人在 UINavigationController 推送过渡动画上遇到过低帧率,但仅在动画的前 0.4-0.7 秒?幕后是否还有其他事情导致它发生,有什么办法吗?

作为引用,这是我当前加载并推送到下一个 View 的代码。我有目的地访问 View getter ,以强制 View 在转换之前加载和初始化(主要是为了排除这个问题)。此代码使用 performSelectorOnMainThread::: 在主线程上执行,以响应 Web 服务回调。

PlayingFieldViewController *v = [[PlayingFieldViewController alloc] initWithNibName"layingFieldView" bundle:[NSBundle mainBundle]];
UIView *lazy = v.view;
[appDelegate.navigationController pushViewController:v animated:YES];
[v release];

我还尝试了其他一些动画技术,结果都一样:

CATransition *transition = [CATransition animation];
transition.duration = 1.0;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
[appDelegate.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[appDelegate.navigationController pushViewController:v animated:NO];

和:

[UIView 
  transitionWithView:appDelegate.navigationController.view
  duration:1.0
  options:UIViewAnimationOptionTransitionCurlUp
  animations:^{
   [appDelegate.navigationController pushViewController:v animated:NO];
  }
  completion:NULL];



Best Answer-推荐答案


经过进一步测试,我能够诊断出问题所在。涉及的第二个 View 包括许多 UIImageViews。删除这些 View 或隐藏它们可以解决问题。

让我失望的是,只有动画的第一部分存在帧速率问题,而动画的其余部分却非常流畅(在较长动画的情况下)。这向我表明,即使所有 subview 都存在,该设备也能够流畅地制作过渡动画。

我仍然不是 iOS 合成方面的专家,但我猜测正在布局和缓存各个层,从而导致速度变慢。解决方法是推到隐藏大部分 subview 的 View ,然后在 View 可见时使用另一个动画显示它们。

关于iphone - UINavigationController 推送过渡期间的低帧率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4306962/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4