方向更改后的 UIView addsubview:告诉视图调整大小

Posted

技术标签:

【中文标题】方向更改后的 UIView addsubview:告诉视图调整大小【英文标题】:UIView addsubview after orientation change: Tell view to resize 【发布时间】:2011-05-13 17:29:29 【问题描述】:

我有一个 UIView 作为纵向模式下的 XIB。

这个视图以编程方式添加到视图控制器中,如下所示:

NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"InputView" owner:self options:nil];
    InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
    [self.view addSubview:inputView];

此视图已正确设置自动调整大小的蒙版,并且在方向从纵向变为横向时可以正常旋转。

但是,如果方向是已经横向并且我在方向更改之后创建视图,则它具有初始纵向方向。

有没有办法通过使用它的掩码告诉视图初始化或调整自身大小为纵向?

提前感谢您的回复!

编辑: 使用 oculus 和 Inder Kumar Rathore 的建议(谢谢大家!),我将代码更改为:

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
[self.view setNeedsLayout];
[self.view layoutSubviews];
[self.view layoutIfNeeded];
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[self shouldAutorotateToInterfaceOrientation:orientation];

不幸的是,根本没有任何变化。 我想我发现有人问同样的问题:

When adding a sub view the view does not resize if the app is in landscape mode

答案正确地识别了问题,但不是很鼓舞人心... 当然,我可以创建两个笔尖或调整框架的大小,但这似乎与自动调整大小的想法背道而驰。 我很难相信在唤醒后没有办法告诉笔尖并将其添加到视图中以使用其自动调整大小功能......当设备旋转时,它可以完美地工作。

编辑 2:

idz的解决办法:

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];

谢谢!

【问题讨论】:

我遇到了这个问题,有两个皱纹:(1)我使用的是受控视图,笔尖加载了 UIVC; & (2) 它只出现在 ios 4.3 下,而不是 5.0。 yasirmturk 的方法为我修复了它。 【参考方案1】:

NIB/XIB 文件通常包含一个 UIViewController 来处理所有这些问题。在这种情况下,由于它们不是视图控制器(在 NIB/XIB 中),您需要接管其加载后职责。

直接调用layoutSubviews,或通过setNeedsLayoutlayoutIfNeeded 间接调用对你没有多大好处,因为默认实现什么都不做。

假设您希望输入视图填充 self.view 的边界,您可以执行以下操作:

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];

必须正确设置子视图的所有调整大小掩码才能使其正常工作,显然,如果您不想填满整个边界,则可能需要调整框架。

【讨论】:

行得通!非常感谢!将编辑帖子以反映您的解决方案。 如果您愿意,您可以非常喜欢并检查自动调整大小的蒙版,并且只检查一个维度,但在我看来,大多数时候,在这些情况下,您都希望两者都进行调整。我将在另一个问题中发布指向此的链接。很高兴它对你有用! 我将输入视图设计为可重复使用的,我要做的是将 show: 更改为 showOnViewController:(UIViewController*)vc,这样 InputView 可以设置自己的框架。 您可以这样做,但是如果您希望它只是更复杂视图的一部分,您将不得不更改您的代码。这就是 UIKit UIView 子类不设置自己的框架的原因。视图控制器是一个类,它知道它管理的屏幕上发生的所有事情。让它处于控制之中是个好主意。只是一个想法。 我有一个视图控制视图来解决这个确切的问题。 yasirmturk 的答案对我有用。【参考方案2】:
[self.view addSubview:viewSpinner];
viewSpinner.frame = self.view.frame;
[viewSpinner setNeedsLayout];

这对我有用(Y)

【讨论】:

我也是,参见。对原始帖子发表评论。【参考方案3】:

不知道你是否还有这个问题。

假设您有以下架构:

窗口 子视图控制器

(您实现了应该自动旋转以正确回答所需的方向)

您想通过调用addSubview 函数将新 UIViewControllers 的视图添加到这个子视图控制器中。

您应该在

中实现,而不是在 shouldautorotate 中实现边界操作
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
  self.newUIViewController.view.frame = self.view.bounds;

didRotateFromInterface... 在shouldRotate 之后调用。在此函数中,边界已正确设置。

这样你就不需要太多的代码操作了。

【讨论】:

【参考方案4】:

查看这个相关问题:

When do autoresizing masks take effect in iOS?

因此,在从 nib 加载新视图并作为子视图添加到 self.view 后,尝试调用 setNeedsLayout

【讨论】:

以上是关于方向更改后的 UIView addsubview:告诉视图调整大小的主要内容,如果未能解决你的问题,请参考以下文章

核心图 - 使图形全屏显示的选项 - 出现模态问题后的 addSubview

当前uiview的addSubView

在 UIView 中绘制以及 addSubview

ios开发怎么获取uiview自动变化后的宽度

在 addSubview 期间奇怪的重复 UIView

使用addSubview将UIView移动到其他UIView中