我目前正在开发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并从那里调用我的控制器上的方法来正确地将键添加到按钮,但这听起来不对。
我的UI由UIViewController管理。但我需要根据UIView的方法更新我的观点。我认为,为了尊重MVC原则,我的观点现在不应该是关于我的控制器的事情,但是这会带来一些问题:
@IBOutlets
保持在按钮上,以便以后可以使用
应用我需要他们的子视图吗?我认为这个问题的复杂性相对较小,我不需要在NSNotificationCenter中设置通知,但我可能错了。我真的很想听到这不是唯一的解决方案。
提前致谢。我希望我足够清楚,但如果您想要/需要有关我的具体情况的任何其他细节,请告诉我,我很乐意详细说明。
答案 0 :(得分:1)
如果我正确理解了这个问题,你的ViewController应该在它的视图中布置键。一个好但不是唯一的地方是viewDidLayoutSubviews
,你可以在UIViewController上覆盖一个方法。
现在,如果您的观点应该保持其内部布局。即如果你的按钮/键有任何子视图,你应该像你提到的那样在UIView上更新那些layoutSubviews
。
将调用这两种方法以响应父视图的边界或中心的更改。
就轮换更改而言,在iOS 8中,您应该根据需要使用viewWillTransitionToSize:withTransitionCoordinator:
或willTransitionToTraitCollection:withTransitionCoordinator:
。
我强烈建议您编写与方向无关的布局。您应该在任何帧中使用包含视图的边界进行参考,并使用 never hard code 。例如,你的一个键可能是它的超视图宽度的1/56,而不是肖像和风景的神奇数字。