8

我有一个 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];

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

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

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

编辑2:

idz 的解决方案有效:

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

谢谢!

4

4 回答 4

19

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

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

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

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

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

于 2011-05-14T08:43:11.393 回答
1
[self.view addSubview:viewSpinner];
viewSpinner.frame = self.view.frame;
[viewSpinner setNeedsLayout];

这对我有用(Y)

于 2011-08-05T12:05:52.387 回答
1

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

假设您具有以下架构:

  • 窗户
    • 子视图控制器

(你实现了 shouldautorotate 正确回答想要的方向)

在这个 subviewcontroller 中,你想通过调用addSubview函数来添加新 UIViewControllers 的视图。

而不是在 shouldautorotate 中实现边界操作,您应该在

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
  self.newUIViewController.view.frame = self.view.bounds;
}

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

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

于 2011-09-26T14:07:03.180 回答
0

请参阅此相关问题:

自动调整大小蒙版在 iOS 中何时生效?

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

于 2011-05-13T20:10:07.250 回答