【问题标题】:Who should manage the UI Elements, the view or the view controller?谁应该管理 UI 元素、视图或视图控制器?
【发布时间】: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


    【解决方案1】:

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

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

    这两种方法都将被调用以响应父视图边界或中心的变化。

    就旋转变化而言,在 iOS 8 中,您应该根据需要使用viewWillTransitionToSize:withTransitionCoordinator:willTransitionToTraitCollection:withTransitionCoordinator:

    我强烈建议您编写独立于方向的布局。您应该只使用包含视图的边界作为参考,并且在任何帧中从不硬编码。例如,也许您的一个键应该是其超级视图宽度的 1/56,而不是纵向和横向的神奇数字。

    【讨论】:

    • 哦,这很有意义。不过有一个问题,应该用什么视图覆盖layoutSubviews 来更新内部布局?按钮?但我读到我不应该子类化 UI 元素。或者在包含按钮的视图的子类中,但是我需要在这个 UIView 子类上有@IBOutlets,因为我需要知道哪个键是哪个键,并且我在情节提要中指定了它。并感谢其他建议,我一定会好好利用它们:)
    • 子类化 UIButton 很棘手!我只是将按钮封装在自定义视图中并在那里进行自定义布局。如果这太过分了,您可以在 ViewController 中的 viewDidLayoutSubviews 中进行布局。只需对您认为最有意义的方法以及看起来最清晰的方法进行最佳判断即可。
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-03-18
    相关资源
    最近更新 更多