在ios中,视图控制器中的适当位置在哪里移动子视图以处理旋转?

时间:2011-08-01 23:27:01

标签: iphone objective-c ios ipad uiviewcontroller

在ios中,哪里是视图控制器中移动自定义子视图以处理旋转的最佳位置? (当然这只适用于autoresizingflags无效的那些)。

以下是我尝试过的地方,以及各自的问题:

  • willAnimateRotationToInterfaceOrientation:持续时间

这很有效,并且当设备旋转横向< - >肖像时,您所做的任何子视图帧更改都会很好地生成动画。但是,如果您在选项卡控制器中,则在另一个VC可见时不会调用此选项卡。因此,如果您旋转并切换回此选项卡,则布局错误。

  • viewWillAppear中

没有真正的帮助,因为在旋转生效之前调用它,所以当访问self.view.frame时,你会得到预旋转大小,所以你不知道我们是去景观还是肖像

  • viewDidAppear

这比viewWillAppear更好,但是因为它在视频进入屏幕后被调用,所以在它弹出之前你会看到错误布局中的内容闪现。

我只是想知道在哪里放置我的代码可以很好地处理我的视图控制器的子视图来处理这两个布局,动画很好。谢谢所有

3 个答案:

答案 0 :(得分:4)

我通常拥有自己的layoutViewsForOrientation:(UIInterfaceOrientation)方法,我可以从willAnimateRotationToInterfaceOrientation:duration调用(以获取您提到的精彩动画),并从我的viewWillAppear:(使用self.interfaceOrientation)调用在它出现之前我的观点。

所以答案是布局视图的正确位置是每当发生变化并且您不确定它是否处于正确的方向时,您可以使用布局功能来保持代码清洁。

答案 1 :(得分:2)

根据我的经验,这里的问题是如果UIViewController不可见,它将不会旋转。您可以有3个标签,每个标签具有不同的UIViewController(A,B和C)。如果您在A中并且旋转,则B和C不会。我通过UIViewController(让我们称之为D)来保持UITabBarController来解决这个问题,然后在此UIViewController我引用了每个UIViewController(A,B)和C)所以我只是在D旋转时为每个willAnimateRotationToInterfaceOrientation:duration调用UIViewController方法。对我来说效果很好。 :)

答案 2 :(得分:0)

我个人提出的最好的方法是抓住每一个事件,似乎有效,但它让我担心应该有更好的方法来做到这一点,而且我做错了。

- (void)doMyResizing {
    self.somesubview.frame = ...
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self doMyResizing];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self doMyResizing]; // This is for the case when the person uses this tab in portrait, changes to another tab, rotates to landscape, and switches back to this tab
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self doMyResizing]; // This is for the case when the person uses this tab in portrait, changes to another tab, rotates to landscape, and switches back to this tab
}