菜鸟教程小白 发表于 2022-12-12 23:20:32

ios - viewWillTransition 给出了错误的大小


                                            <p><p>我正在制作自定义键盘。我想根据 View 的宽度和高度生成键(UIButtons)的宽度和高度。</p>

<p>最初加载键盘时,viewDidAppear 会正确确定 View 的高度。 (375 x 216)</p>

<pre><code>override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
      self.renderKeys()
    }
</code></pre>

<p> <a href="/image/Dmlb6.png" rel="noreferrer noopener nofollow"><img src="/image/Dmlb6.png" alt="enter image description here"/></a> </p>

<p>当旋转到横向时,它会调用 viewWillTransition</p>

<pre><code>override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    NSLog(&#34;toSize \(size.width) x \(size.height)&#34;)

    coordinator.animate(alongsideTransition: {(_ context: UIViewControllerTransitionCoordinatorContext) -&gt; Void in
      NSLog(&#34;animating \(self.view.frame.width) x\(self.view.frame.height)&#34;)

    }, completion: {(_ context: UIViewControllerTransitionCoordinatorContext) -&gt; Void in

      NSLog(&#34;animationCompleted \(self.view.frame.width) x\(self.view.frame.height)&#34;)
      self.renderKeys()
    })

}
</code></pre>

<p> <a href="/image/Uj13L.png" rel="noreferrer noopener nofollow"><img src="/image/Uj13L.png" alt="enter image description here"/></a> </p>

<p>旋转回纵向会导致此结果。</p>

<p> <a href="/image/wkBR0.png" rel="noreferrer noopener nofollow"><img src="/image/wkBR0.png" alt="enter image description here"/></a> </p>

<p>我发现 viewWillTransition 的大小不能正确确定 View 的大小,或者我只是误解了该函数的用法。即使在动画之后,我也无法获得正确的 View 宽度和高度。</p>

<p>这是按顺序排列的调试日志。 </p>

<pre><code> Calling viewDidAppear

Cleaning keys
toSize 667.0 x 216.0
animating 667.0 x216.0
animationCompleted 667.0 x216.0

Cleaning keys
toSize 375.0 x 162.0
animating 375.0 x162.0
animationCompleted 375.0 x162.0
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我也在使用自定义键盘,发现了类似的问题。</p>

<p>经过几个小时的实验,我学到了以下几点:</p>

<ul>
<li>将键盘作为应用运行时, View 只加载一次,应用生命周期按预期完成(<code>application(didFinishLaunchingWithOptions:)</code>, <code>applicationDidBecomeActive</code> )等被执行)</li>
<li>所有方向转换都可以在 <code>viewWillTransition(to size:)</code> 中捕获。例如在 iPhone 8+ 中,这将报告大小为 (414.0, 736.0) 或 (736.0, 414.0)</li>
</ul>

<p><strong>现在,将项目作为键盘目标运行:</strong>
- </p>

<ul>
<li>系统不遵循常规的应用生命周期:
<code>应用程序(didFinishLaunchingWithOptions:</code>),
<code>applicationDidBecomeActive</code>等不上报

<ul>
<li>每次设备从垂直变为水平或反之时,都会加载主 <code>ViewController</code>。</li>
<li>考虑到您可能需要延迟(使用
<code>Timer.scheduledTimer(withTimeInterval:)</code>,至少在第一次迭代中</li>
<li><code>updateViewConstraints()</code>中报告了viewSize,但大小似乎并不完全可靠。每次过渡到
纵向,它可以报告尺寸为 414 x 736 (ScreenSize) 或 414
x 226(正确的键盘尺寸)。如果是 iPhone 8+</li>
<li>鉴于对应用生命周期的这种特殊管理,从 Portrait 开始时不会执行 <code>viewWillTransition</code> 方法
到横向或从横向到纵向(我想这与每次旋转中断的 View 生命周期有关)。 </li>
<li>从 LandscapeLeft 到 LandscapeRight 时执行(通过 UpsideDown,未启用),它报告正确的大小(736 x 162 in an
iPhone 8+)</li>
</ul></li>
</ul>

<p>所以,我正在做的是在延迟后捕获 <code>viewDidLoad</code> 中的屏幕大小并忘记 <code>updateViewConstraints</code> 或 <code>viewWillTransition(to size:)</code></p>

<pre><code>Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { (nil) in
    print(&#34;Load Size: \(self.view.frame.size)&#34;)
}
</code></pre>

<p>注意* 这个延迟似乎只在第一次加载时需要(在这种情况下,甚至 <code>updateViewConstraints</code> 在 <code>viewDidLoad</code> 之前执行。在 viewDidLoad 的以下迭代中,它是不需要。另外。您可能想试验一下延迟,并在实际设备和模拟器中进行测试</p>

<p>引用表:</p>

<p><strong>设备 -(屏幕)-(键盘纵向)-(键盘横向)</strong></p>

<p>iPhone X - (375 x 812) - (375 x 141) - (662 x 131)</p>

<p>iPhone 8+ - (414 x 736) - (414 x 226) - (736 x 162)</p>

<p>iPhone 7+/8+ - (414 x 736) - (414 x 226) - (736 x 162)</p>

<p>iPhone 7/8 - (375 x 667) - (375 x 216) - (667 x 162)</p>

<p>6/6s/6+/6s+ - 与 iPhone 7/8 相同</p>

<p>iPhone SE - (320 x 568) - (320 x 216) - (568 x 162)</p>

<p>我希望它有所帮助。问候... e</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - viewWillTransition 给出了错误的大小,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41309308/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41309308/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - viewWillTransition 给出了错误的大小