我目前正在开发一个 iOS 应用程序,我想知道如何管理 UI 元素。我正在使用 Storyboard 来放置我的 View 和 Autolayout 以使所有分辨率都独立。如果有帮助,这里有一些关于我是如何提出这个问题的背景信息。
我有代表钢琴键的按钮,稍后我在代码中添加了一个 subview ,在它们上绘制实际的键。我通过在 ViewController 上创建 @IBOutlets
并订阅 UIDeviceOrientationDidChangeNotification
来做到这一点。这调用了一个方法,该方法根据当前按钮 frames
添加 subview 以获取适当大小的键。
这在 iOS 8.1 中运行时运行良好,但如果我在 iOS 7 上运行该应用程序,则在我获得 时按钮的框架并未更新为新方向>UIDeviceOrientationDidChangeNotification
,所以横向的一切都搞砸了。我做了一些研究( UIInterfaceOrientation not yet updated when UIDeviceOrientationDidChangeNotification caught in UIView ),似乎一个好的解决方案是覆盖 layoutSubviews
方法。问题是,layoutSubviews
是一种 UIView 方法,我在 UIViewController 中管理我的按钮和 UI。
一时冲动,我想继承我的 UIView,重写 layoutSubviews 并从那里调用我的 Controller 上的一个方法来正确地将键添加到按钮,但这听起来不对。
我的 UI 由 UIViewController 管理。但是我需要根据 UIView 的适当方法更新我的 View 。我假设,为了尊重 MVC 原则,我的观点现在不应该是关于我的 Controller 的事情,但这会带来一些问题:
@IBOutlets
保存在按钮上,以便以后可以
应用我需要的 subview ?我假设这个问题的复杂性相对较小,我不需要在 NSNotificationCenter 中设置通知,但我可能错了。我真的很想听听这不是唯一的解决方案。
提前致谢。我希望我已经足够清楚了,但是如果您想/需要关于我的具体情况的任何其他详细信息,请告诉我,我会很乐意详细说明。
如果我正确理解了这个问题,您的 ViewController 应该在其 View 中布置键。 viewDidLayoutSubviews
是一个很好但不是唯一的地方,您可以在 UIViewController 上覆盖该方法。
现在,如果您的 View 应该保持其内部布局。即如果您的按钮/键有任何 subview ,您应该更新 UIView 上的 layoutSubviews
中的那些。
这两种方法都将被调用以响应父 View 边界或中心的变化。
就旋转变化而言,在 iOS 8 中,您应该使用 viewWillTransitionToSize:withTransitionCoordinator:
或 willTransitionToTraitCollection:withTransitionCoordinator:
取决于您的需要。
我强烈建议您编写独立于方向的布局。您应该只使用包含 View 的边界作为引用,并且在任何帧中从不硬编码。例如,也许您的一个键应该是其 super View 宽度的 1/56,而不是纵向和横向的神奇数字。
关于ios - 谁应该管理 UI 元素、 View 或 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27596052/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |