谁应该管理UI元素,视图或视图控制器?

时间:2014-12-22 02:59:29

标签: ios objective-c cocoa-touch uiview rotation

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

一些Backgroud

Button layout

我有按钮代表钢琴键,我稍后在代码中添加一个子视图,在其上绘制实际的键。我是通过在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并从那里调用我的控制器上的方法来正确地将键添加到按钮,但这听起来不对。

问题

我的UI由UIViewController管理。但我需要根据UIView的方法更新我的观点。我认为,为了尊重MVC原则,我的观点现在不应该是关于我的控制器的事情,但是这会带来一些问题:

  • 谁应该管理用户界面?
  • 我的策略是错误的吗? UIView将@IBOutlets保持在按钮上,以便以后可以使用 应用我需要他们的子视图吗?
  • 如果您阅读背景信息,您是否对此特定情况有任何建议?

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

提前致谢。我希望我足够清楚,但如果您想要/需要有关我的具体情况的任何其他细节,请告诉我,我很乐意详细说明。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你的ViewController应该在它的视图中布置键。一个好但不是唯一的地方是viewDidLayoutSubviews,你可以在UIViewController上覆盖一个方法。

现在,如果您的观点应该保持其内部布局。即如果你的按钮/键有任何子视图,你应该像你提到的那样在UIView上更新那些layoutSubviews

将调用这两种方法以响应父视图的边界或中心的更改。

就轮换更改而言,在iOS 8中,您应该根据需要使用viewWillTransitionToSize:withTransitionCoordinator:willTransitionToTraitCollection:withTransitionCoordinator:

我强烈建议您编写与方向无关的布局。您应该在任何帧中使用包含视图的边界进行参考,并使用 never hard code 。例如,你的一个键可能是它的超视图宽度的1/56,而不是肖像和风景的神奇数字。