菜鸟教程小白 发表于 2022-12-12 15:38:05

iphone - UINavigationController 推送过渡期间的低帧率


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

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

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

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

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

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

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

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

<pre><code>PlayingFieldViewController *v = [ initWithNibName:@&#34;PlayingFieldView&#34; bundle:];
UIView *lazy = v.view;
;
;
</code></pre>

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

<pre><code>CATransition *transition = ;
transition.duration = 1.0;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
;
;
</code></pre>

<p>和:</p>

<pre><code>[UIView
transitionWithView:appDelegate.navigationController.view
duration:1.0
options:UIViewAnimationOptionTransitionCurlUp
animations:^{
   ;
}
completion:NULL];
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>经过进一步测试,我能够诊断出问题所在。涉及的第二个 View 包括许多 <code>UIImageViews</code>。删除这些 View 或隐藏它们可以解决问题。</p>

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

<p>我仍然不是 iOS 合成方面的专家,但我猜测正在布局和缓存各个层,从而导致速度变慢。解决方法是推到隐藏大部分 subview 的 View ,然后在 View 可见时使用另一个动画显示它们。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - UINavigationController 推送过渡期间的低帧率,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/4306962/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/4306962/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - UINavigationController 推送过渡期间的低帧率