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

Posted

技术标签:

【中文标题】在 ios 中,视图控制器中移动子视图以处理旋转的正确位置在哪里?【英文标题】:In ios, where's the proper place in a view controller to move your subviews to handle rotations? 【发布时间】:2011-08-01 23:27:00 【问题描述】:

ios 中,视图控制器中移动自定义子视图以处理旋转的最佳位置在哪里? (当然,这仅适用于那些 autoresizingflags 没有帮助的情况)。

这是我尝试过的以下地方,每个地方都有问题:

willAnimateRotationToInterfaceOrientation:duration

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

viewWillAppear

并没有真正的帮助,因为它在旋转生效之前被调用,所以当访问 self.view.frame 时,你会得到旋转前的大小,所以你不知道我们是要横向还是纵向

viewDidAppear

这比 viewWillAppear 好,但是因为它是在视图出现在屏幕上之后调用的,所以在它闪过之前,您会在错误的布局中看到一闪而过的内容。

我只想知道将我的代码放置在哪里合适,该代码可以很好地布置我的视图控制器的子视图以处理两种布局,并且动画效果很好。谢谢大家

【问题讨论】:

【参考方案1】:

我通常有自己的 layoutViewsForOrientation:(UIInterfaceOrientation) 方法,我从 willAnimateRotationToInterfaceOrientation:duration 调用(以获得您提到的漂亮动画),从我的 viewWillAppear:(使用 self.interfaceOrientation)调用它以在视图出现之前设置我的视图.

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

【讨论】:

听起来像我所做的,但我也从 viewDidAppear 调用它,以处理选项卡不可见时的旋转边缘情况【参考方案2】:

根据我的经验,这里的问题是如果UIViewController 不可见,它就不会旋转。您可以有 3 个选项卡,每个选项卡具有不同的 UIViewController(A、B 和 C)。如果你在 A 并且你旋转,B 和 C 不会。我解决了这个问题,通过使用UIViewController(我们称之为 D)来保存UITabBarController,然后在这个UIViewController 中我引用了每个UIViewController(A、B 和 C),所以我只调用当 D 旋转时,每个 UIViewControllerwillAnimateRotationToInterfaceOrientation:duration 方法。对我来说效果很好。 :)

【讨论】:

这样做的好方法,我很高兴听到我不是唯一遇到此问题的人。对我来说,这似乎是 UIKit 中的一个遗漏,因为不幸的是,并非所有情况都可以通过自动调整大小标志来处理。 我什至不使用自动调整大小的克里斯,我在代码中进行了更改。【参考方案3】:

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

- (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

【讨论】:

以上是关于在 ios 中,视图控制器中移动子视图以处理旋转的正确位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 7 中重新计算旋转时的子视图大小

在 iOS 6 上处理 iDevice 旋转

UINavigationController 的子视图中调用的旋转方法?

视图控制器和自动布局旋转问题

IOS6 使用自动布局的约束

iOS 无法在设备旋转时自动调整子视图大小