菜鸟教程小白 发表于 2022-12-13 04:09:22

ios - 谁应该管理 UI 元素、 View 或 View Controller ?


                                            <p><p>我目前正在开发一个 iOS 应用程序,我想知道如何管理 UI 元素。我正在使用 Storyboard 来放置我的 View 和 Autolayout 以使所有分辨率都独立。如果有帮助,这里有一些关于我是如何提出这个问题的背景信息。</p>

<h2>一些背景</h2>

<p> <img src="/image/RjQgW.png" alt="Button layout"/> </p>

<p>我有代表钢琴键的按钮,稍后我在代码中添加了一个 subview ,在它们上绘制实际的键。我通过在 ViewController 上创建 <code>@IBOutlets</code> 并订阅 <strong><code>UIDeviceOrientationDidChangeNotification</code></strong> 来做到这一点。这调用了一个方法,该方法根据当前按钮 <code>frames</code> 添加 subview 以获取适当大小的键。</p>

<p>这在 iOS 8.1 中运行时运行良好,但如果我在 <strong>iOS 7</strong> 上运行该应用程序,则在我获得 <strong> 时按钮的框架并未更新为新方向><code>UIDeviceOrientationDidChangeNotification</code></strong>,所以横向的一切都搞砸了。我做了一些研究( <a href="https://stackoverflow.com/questions/19974246/uiinterfaceorientation-not-yet-updated-when-uideviceorientationdidchangenotifica" rel="noreferrer noopener nofollow">UIInterfaceOrientation not yet updated when UIDeviceOrientationDidChangeNotification caught in UIView</a> ),似乎一个好的解决方案是覆盖 <code>layoutSubviews</code> 方法。问题是,<strong><code>layoutSubviews</code>是一种 UIView 方法,我在 UIViewController 中管理我的按钮和 UI。</strong></p>

<p>一时冲动,我想继承我的 UIView,重写 layoutSubviews 并从那里调用我的 Controller 上的一个方法来正确地将键添加到按钮,但这听起来不对。</p>

<h2>问题</h2>

<p>我的 UI 由 UIViewController 管理。但是我需要根据 UIView 的适当方法更新我的 View 。我假设,为了尊重 MVC 原则,我的观点现在不应该是关于我的 Controller 的事情,但这会带来一些问题:</p>

<ul>
<li>谁应该管理 UI?</li>
<li>我的策略有错吗?
UIView 将 <code>@IBOutlets</code> 保存在按钮上,以便以后可以
应用我需要的 subview ?</li>
<li>如果您阅读了背景,您对这种特殊情况有什么建议吗?</li>
</ul>

<p>我假设这个问题的复杂性相对较小,我不需要在 NSNotificationCenter 中设置通知,但我可能错了。我真的很想听听这不是唯一的解决方案。</p>

<p>提前致谢。我希望我已经足够清楚了,但是如果您想/需要关于我的具体情况的任何其他详细信息,请告诉我,我会很乐意详细说明。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果我正确理解了这个问题,您的 ViewController 应该在其 View 中布置键。 <code>viewDidLayoutSubviews</code> 是一个很好但不是唯一的地方,您可以在 UIViewController 上覆盖该方法。 </p>

<p>现在,如果您的 View 应该保持其内部布局。即如果您的按钮/键有任何 subview ,您应该更新 UIView 上的 <code>layoutSubviews</code> 中的那些。</p>

<p>这两种方法都将被调用以响应父 View 边界或中心的变化。</p>

<p>就旋转变化而言,在 iOS 8 中,您应该使用 <code>viewWillTransitionToSize:withTransitionCoordinator:</code> 或 <code>willTransitionToTraitCollection:withTransitionCoordinator:
</code> 取决于您的需要。 </p>

<p>我强烈建议您编写独立于方向的布局。您应该只使用包含 View 的边界作为引用,并且在任何帧中<em>从不硬编码</em>。例如,也许您的一个键应该是其 superView 宽度的 1/56,而不是纵向和横向的神奇数字。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 谁应该管理 UI 元素、 View 或 ViewController ?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/27596052/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/27596052/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 谁应该管理 UI 元素、 View 或 View Controller ?