添加子视图时,如果应用程序处于横向模式,则视图不会调整大小

Posted

技术标签:

【中文标题】添加子视图时,如果应用程序处于横向模式,则视图不会调整大小【英文标题】:When adding a sub view the view does not resize if the app is in landscape mode 【发布时间】:2011-03-01 23:55:06 【问题描述】:

我有一个已在 Interface Builder 中创建并配置为根据方向调整大小的视图。如果在应用程序处于纵向模式时创建视图并将其添加到显示中,则一切正常。然后我可以旋转设备/模拟器,并按照我的预期调整视图大小。但是,如果在应用程序处于横向模式时添加视图,它不会正确调整大小。视图的创建和大小就像应用程序仍处于纵向模式一样。视图添加了以下代码:

self.viewController = [[MyViewController alloc] initWithNibName:nibName bundle:bundle];
[self addSubview:self.viewController.view];

这里没有发生任何神奇的事情。此外,视图控制器指定:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    return YES;

同样,只要在纵向模式下添加视图,它就会按预期工作。我尝试了几种不同的方法,包括在视图上手动设置 autoresizingMask 属性、调用 setNeedsLayout 和调用 layoutIfNeeded,但似乎没有任何效果。我可以手动设置框架的宽度和高度以强制调整视图大小,但这会破坏视图的动态特性。例如,如果我手动设置宽度,则高度不会调整,因为内容不会重新布局。

有什么想法吗?

【问题讨论】:

【参考方案1】:

只需像这样设置您的子视图框架

self.viewController.view.frame = self.view.bounds;

【讨论】:

【参考方案2】:

这里有一个快速的答案,虽然我猜你已经解决了这个问题:) 原因是当您创建和添加视图时,它是从带有纵向框架的笔尖加载的。加载时,它不会自动旋转,因为此时应用程序无法知道您的意思是要旋转它。

一些选项包括:

    有一个纵向和一个横向笔尖,并在添加视图时根据当前方向从适当的笔尖加载。

    加载后在代码中进行调整,就像您之前所做的那样。

也可能存在强制重新布局的选项,在我看来,这就是您所追求的。

HTH

【讨论】:

【参考方案3】:

我刚刚发布了一个几乎相同问题的答案。查看UIView addsubview after orientation change

【讨论】:

【参考方案4】:

这将会发生,您只需将一个视图控制器的视图添加到另一个视图控制器上。这是一种不好的做法,可能会导致内部不一致异常。请参阅 WWDC 的 Container Api 视频。对于这样的事情,使用了包含 api。

但你仍然想这样做。添加视图后,需要在 self.viewController 上调用 shouldAutorotateToInterfaceOrientation

【讨论】:

如果这不起作用,设置self.viewController.view的框架也为self.viewController.view设置autotresizing mask,默认不调整子视图的大小

以上是关于添加子视图时,如果应用程序处于横向模式,则视图不会调整大小的主要内容,如果未能解决你的问题,请参考以下文章

从纵向模式旋转到横向模式时不调整子视图

在仅纵向应用程序中以横向模式添加子视图

在横向模式下添加 UIView

在 iPad 上以编程方式添加子视图,硬编码

视图控制器处于横向模式,但我从纵向模式获取框架?

UIView 在横向模式下被切断