【发布时间】:2014-12-22 02:59:28
【问题描述】:
我目前正在开发一个 iOS 应用程序,我想知道如何管理 UI 元素。我正在使用 Storyboard 来放置我的视图和 Autolayout 以使所有分辨率都独立。如果有帮助,这里有一些关于我是如何提出这个问题的背景信息。
一些背景
我有代表钢琴键的按钮,稍后我在代码中添加了一个子视图,在它们上绘制实际的键。我通过在 ViewController 上创建 @IBOutlets 并订阅 UIDeviceOrientationDidChangeNotification 来做到这一点。这称为基于当前按钮frames 添加子视图的方法,以获取适当大小的键。
这在 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 的适当方法更新我的视图。我假设,为了尊重 MVC 原则,我的观点现在不应该是关于我的控制器的事情,但这会带来一些问题:
- 谁应该管理 UI?
- 我的策略有错吗?
UIView 将
@IBOutlets放在按钮上,以便以后可以 应用我需要的子视图? - 如果您阅读了背景,您对这种特殊情况有什么建议吗?
我假设这个问题的复杂性相对较小,我不需要在 NSNotificationCenter 中设置通知,但我可能错了。我真的很想听听这不是唯一的解决方案。
提前致谢。我希望我已经足够清楚了,但是如果您想/需要关于我的具体情况的任何其他详细信息,请告诉我,我会很乐意详细说明。
【问题讨论】:
标签: ios objective-c cocoa-touch uiview rotation