【问题标题】:Frustrated with view initialization in loadView对 loadView 中的视图初始化感到沮丧
【发布时间】:2012-01-30 23:37:32
【问题描述】:

在为 ios 开发时,我以编程方式完成所有操作,因此我在 loadView 中为我的所有视图控制器手动初始化视图控制器视图(这是 Apple 所说的)。这样做让我感到沮丧的是 viewcontrollers 框架最初是 {{0, 20}, {320, 460}} 没有正确考虑我在我的应用程序中拥有的任何导航栏或标签栏。视图最终在 viewDidAppear 中设置了适当的框架,但到那时再做任何事情都为时已晚。有没有办法让它更早地识别视图布局而无需手动计算?

这很令人沮丧,因为我总是必须手动检查手机是否处于横向或纵向模式以解决旋转问题,以及是否必须以我无法自动调整大小的特定方式设置子视图,然后我还必须进行手动计算。

有没有苹果推荐这样做的任何模式,或者有没有让它更早地识别视图布局而无需手动计算?

【问题讨论】:

  • 只是好奇,你为什么要以编程方式做所有事情?
  • 您应该使用[[UIScreen mainScreen] bounds] 来获取视图的当前大小
  • 我只是喜欢,我为我的应用创建的很多视图在运行时都是动态的,所以我需要这样做。

标签: iphone ios cocoa-touch design-patterns uiviewcontroller


【解决方案1】:

如果您使用的是 iOS 5,您应该在 UIViewController 子类的 viewDidLayoutSubviewsviewWillLayoutSubviews 方法中传递正确的帧。这是您应该计算布局的地方,它们会在设备旋转时被调用。

否则,viewWillAppear 从 iOS 2.0 开始存在,我的测试应用显示它通过了正确的帧。它不能解决中途轮换问题,但大概您可以在其他地方进行轮换。你不打算在游戏后期建立你的观点,但除了玩 viewDidLoadlayoutIfNeeded (我过去没能开始工作)我不知道你是什么应该在iOS5之前做。

【讨论】:

  • 注意:这些方法只存在于 iOS 5 中。
  • 是的,对不起,我忘了提,尽量不使用 ios 5 库希望我的应用程序向后兼容。
  • “viewWillAppear”怎么样?这存在于 iOS 2.0 中,我的测试应用程序显示它通过了正确的框架。它不能解决中途轮换问题,但大概你可以在其他地方解决这个问题。
  • viewWillAppear 将起作用,但您不应该在视图控制器生命周期的后期设置视图。真的应该在 loadView 中做所有事情,用 viewDidLoad 中的数据填充视图,并使用 viewWillAppear、viewDidAPpear 来启动线程和动画。
  • 我同意您不应该这样做,但我从未广泛使用 5.0 之前的版本,所以不知道您应该使用什么来解决这个特定问题。从viewDidLoad 调用父视图的layoutIfNeeded 方法可能有效;文档说如果需要它应该立即布置,但有一次我尝试使用它并以不同的方式解决了我的问题时运气不佳。
【解决方案2】:

您可以确保您的视图具有正确的自动调整大小掩码,并且一旦新大小进入,它应该全部调整。

[view setAutoresizingMask:UIViewAutoresizingFlexibleHeight];

这就是我通常做的。否则,我会在稍后的回调中调整布局 - 由 viewWillAppear 为导航栏调整,不确定 viewDidLoad 是否为时过早。

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 2011-05-29
    • 2011-01-26
    • 1970-01-01
    • 2014-07-21
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多