UIView在方向更改后添加子视图:告诉视图调整大小

时间:2011-05-13 17:29:29

标签: iphone orientation addsubview autoresizingmask

我在肖像模式下将UIView作为XIB。

此视图以编程方式添加到viewcontroller,如下所示:

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

此视图可正确设置自动调整遮罩,并在方向从纵向更改为横向时旋转正常。

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

有没有办法通过使用蒙版来告诉视图初始化或将自身大小调整为肖像?

预先感谢您的回复!

编辑: 使用occulus和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];

谢谢!

4 个答案:

答案 0 :(得分:19)

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];

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

答案 1 :(得分:1)

[self.view addSubview:viewSpinner];
viewSpinner.frame = self.view.frame;
[viewSpinner setNeedsLayout];

这对我有用(Y)

答案 2 :(得分:1)

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

假设您有以下架构:

  • 窗口
    • subviewcontroller

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

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

您应该在

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

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

这样你就不需要通过代码进行如此多的操作了。

答案 3 :(得分:0)

请参阅此相关问题:

When do autoresizing masks take effect in iOS?

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