Ios 谁应该管理UI元素、视图或视图控制器?
我目前正在开发一个iOS应用程序,我想知道如何管理UI元素。我使用故事板来放置视图和自动布局,使所有内容都独立于分辨率。如果有帮助的话,这里有一些我提出这个问题的背景资料 一些背景 我有代表钢琴键的按钮,我稍后在代码中为这些按钮添加了一个子视图,用于在这些按钮上绘制实际的键。为此,我在ViewController上创建了Ios 谁应该管理UI元素、视图或视图控制器?,ios,objective-c,cocoa-touch,uiview,rotation,Ios,Objective C,Cocoa Touch,Uiview,Rotation,我目前正在开发一个iOS应用程序,我想知道如何管理UI元素。我使用故事板来放置视图和自动布局,使所有内容都独立于分辨率。如果有帮助的话,这里有一些我提出这个问题的背景资料 一些背景 我有代表钢琴键的按钮,我稍后在代码中为这些按钮添加了一个子视图,用于在这些按钮上绘制实际的键。为此,我在ViewController上创建了@IBOutlets,并订阅了UIDeviceOrientationIDChangeNotification。这调用了一种方法,该方法基于当前按钮帧添加子视图以获得适当大小的关
@IBOutlets
,并订阅了UIDeviceOrientationIDChangeNotification
。这调用了一种方法,该方法基于当前按钮帧添加子视图以获得适当大小的关键帧
这在iOS 8.1中运行时效果很好,但是如果我在iOS 7上运行应用程序,在我收到UIDeviceOrientationIDChangeNotification时,按钮的框架并没有更新到新的方向,因此在横向环境中一切都乱七八糟。我做了一些研究(),似乎一个好的解决方案是重写layoutSubviews
方法。问题是,layoutSubviews
是一种UIView方法,我在UIViewController中管理我的按钮和UI。
我冲动地想对UIView进行子类化,覆盖LayoutSubView,然后从那里调用控制器上的一个方法来正确地将键添加到按钮,但这听起来并不正确
问题
我的UI由UIViewController管理。但是我需要基于UIView的方法更新我的视图。为了尊重MVC原则,我假设我的观点现在不应该成为我控制器的一部分,但这引出了几个问题:
- 谁应该管理UI
- 我的策略是错误的吗
UIView按住按钮上的
@IBOutlets
,以便以后可以查看
应用我需要的子视图
- 如果你阅读了背景资料,你对这种特殊情况有什么建议吗
我假设这个问题的复杂性相对较小,我不需要在NSNotificationCenter中设置通知,但我可能错了。我真的很想听到这不是唯一的解决办法
提前谢谢。我希望我说得足够清楚,但是如果您想/需要关于我的特殊情况的任何其他详细信息,请告诉我,我将很乐意详细说明。如果我正确理解了问题,您的ViewController应该在其视图中布置关键点。在viewDidLayoutSubviews
中有一个很好但不是唯一的地方可以这样做,您可以在UIViewController上覆盖该方法
现在,如果视图应保持其内部布局。i、 e如果您的按钮/键有任何子视图,您应该更新UIView上的layoutSubviews
中的子视图,如您所述
这两种方法都将被调用,以响应父视图边界或中心的更改
就旋转更改而言,在iOS 8中,您应该使用viewwilltransitionosize:withtransitionocordinator:
或willtransitionostraitcollection:withtransitionocordinator:
根据您的需要而定
我强烈建议您独立于方向编写布局。您应该只使用包含视图的边界作为参考,而不要在任何帧中硬编码。例如,您的一个关键点应该是superview宽度的1/56,而不是肖像和风景的神奇数字。哦,这很有意义。但是有一个问题,哪个视图应该覆盖layoutSubviews
来更新内部布局?按钮?但是我读到我不应该对UI元素进行子类化。或者在包含按钮的视图的子类中,但是我需要在这个UIView子类上有@IBOutlets
,因为我需要知道哪个键是哪个键,并且我在情节提要中指定了那个键。感谢其他的建议,我一定会好好利用它们:)子类化UIButton是很棘手的!我只是将按钮封装在自定义视图中,并在那里进行自定义布局。如果这太过分了,您可以在ViewController的viewDidLayoutSubviews
中进行布局。只要对你认为最有意义的事情和最清晰的方式做出最好的判断。