UIViewController在viewWillAppear和viewDidAppear之间调整自己的大小?

时间:2011-05-06 15:22:34

标签: ios uiviewcontroller uiscrollview viewdidappear viewwillappear

我的项目中有一个非常奇怪的错误。我有一个UIScrollView作为我的主要观点。在其中,我有一个UIViewController(不是UITableViewController),它有一个UITableView实例变量,还有一些杂项UIButtons。我已将视图控制器的视图框设置为CGRectMake(0, 64, 320, 388),因为我上面有一个标签栏(这还没有用)。起初它效果很好,看起来很棒,但是一旦我出现并解雇modalViewController(因此重新加载UIViewController,我相信),它会将UIViewController的视图推到顶部屏幕(默认情况下将其设置为CGRectMake(0, 0, 320, 460),但由于我已将wantsFullScreenLayout设置为NO,因此现在将其设置为CGRectMake(0, 0, 320, 388)

我已将此问题跟踪到viewWillAppearviewDidAppear之间的某个位置。解雇modalViewController后,这是我的确切日志:

  

2011-05-06 11:08:39.974 Campus [1570:207] Frame is 0.000000,64.000000,320.000000,388.000000(viewWillAppear)
  2011-05-06 11:08:40.378校园[1570:207]框架为0.000000,0.000000,320.000000,388.000000(viewDidAppear)

如您所见,viewWillAppear中的框架正常,但viewDidAppear中没有。

我已经做了以下事情来尝试解决它:
- 在loadViewviewDidLoadviewWillAppearviewDidAppear中设置所需的框架。
- 将我的wantsFullScreenLayout设为NO - 我的方法覆盖了我的[super viewWillAppear:][super viewDidAppear:]来电。

我该怎么办?!?!?

1 个答案:

答案 0 :(得分:0)

我的问题是,从iOS 4开始,Apple每个窗口仅支持1个视图控制器。但是,从iOS 5开始,Apple增加了对容器视图控制器的支持,并添加了UIViewController方法,例如addChildViewController:。使用容器视图控制器算法解决了我的问题。请访问UIViewController Class Reference了解详情。

编辑:对于那些懒得在类引用中搜索“容器视图控制器”的人,这里是类引用中相关部分的要点:

  

自定义UIViewController子类也可以充当容器视图   控制器。容器视图控制器管理表示   它拥有的其他视图控制器的内容,也称为其子视图   查看控制器。孩子的视图可以按原样显示或显示在   与容器视图控制器拥有的视图结合使用。

     

您的容器视图控制器子类应声明为public   用于关联其子级的界面。这些方法的性质已经提升   对你而言,取决于你正在创建的容器的语义。   您需要确定视图可以显示的子项数   控制器,当这些孩子被显示,他们在哪里   出现在视图控制器的视图层次结构中。你的视图控制器   class定义子项共享的关系(如果有)。   通过为您的容器建立一个干净的公共接口,您   确保孩子在逻辑上使用其功能,而无需访问   关于容器如何实现的太多私密细节   行为。

     

您的容器视图控制器必须关联子视图控制器   在将子视图的根视图添加到视图层次结构之前使用它自己。   这允许iOS正确地将事件路由到子视图控制器和   那些控制器管理的视图。同样,它删除后   子视图层次结构中的子视图,它应该断开它   子视图控制器本身。打破或打破这些   关联,您的容器调用由...定义的特定方法   基类。这些方法并非旨在由客户调用   你的容器类;它们只能由您的容器使用   实现以提供预期的包含行为。