Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 谁应该管理UI元素、视图或视图控制器?_Ios_Objective C_Cocoa Touch_Uiview_Rotation - Fatal编程技术网

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

Ios 谁应该管理UI元素、视图或视图控制器?,ios,objective-c,cocoa-touch,uiview,rotation,Ios,Objective C,Cocoa Touch,Uiview,Rotation,我目前正在开发一个iOS应用程序,我想知道如何管理UI元素。我使用故事板来放置视图和自动布局,使所有内容都独立于分辨率。如果有帮助的话,这里有一些我提出这个问题的背景资料 一些背景 我有代表钢琴键的按钮,我稍后在代码中为这些按钮添加了一个子视图,用于在这些按钮上绘制实际的键。为此,我在ViewController上创建了@IBOutlets,并订阅了UIDeviceOrientationIDChangeNotification。这调用了一种方法,该方法基于当前按钮帧添加子视图以获得适当大小的关

我目前正在开发一个iOS应用程序,我想知道如何管理UI元素。我使用故事板来放置视图和自动布局,使所有内容都独立于分辨率。如果有帮助的话,这里有一些我提出这个问题的背景资料

一些背景

我有代表钢琴键的按钮,我稍后在代码中为这些按钮添加了一个子视图,用于在这些按钮上绘制实际的键。为此,我在ViewController上创建了
@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
中进行布局。只要对你认为最有意义的事情和最清晰的方式做出最好的判断。