1

我有一个 UIViewController 和一个纵向的 iPad xib。当我的 iPad 处于横向并且我将该视图控制器放入我的 UISplitViewController 的详细信息窗格时,它会自动调整大小以适应这很棒。

但是,当我在 -viewDidLoad 中配置视图时,视图的最终大小还不是横向/大小。

-didRotateFromInterfaceOrientation: 方法和与之关联的其他方法在 UIViewController 已经加载到横向时不会被调用,所以我何时何地能够正确设置滚动视图的 contentSize 及其内容?

我只希望我的滚动视图垂直滚动,所以我想确保滚动视图中的内容视图在任何方向上都重新适合视图控制器的宽度。

无论我检查什么 .frame 或 .bounds,无论是在我的视图、滚动视图,还是我的 SplitViewController 的详细视图控制器上,都会向我显示我的实际尺寸是多少。在横向使用 UISplitViewController 时,左侧为 320px 宽,这意味着右侧不应超过 704px 宽,但每当我检查视图和滚动视图的框架和边界时,它们报告为 768px 宽这是不正确的。

我的滚动视图显然只有 704px 宽,因为我可以正确地看到滚动指示器。

我错过了什么?

这是我在 -viewDidLoad 中的代码...

CGSize textSize = [self.purchase.textDescription sizeWithFont:self.labelTextDescription.font constrainedToSize:allowedSize lineBreakMode:UILineBreakModeWordWrap];

CGRect textFrame = self.labelTextDescription.frame;
textFrame.size.height = textSize.height;
self.labelTextDescription.frame = textFrame;

CGRect contentFrame = self.contentView.frame;
contentFrame.size.height += textSize.height;

if (contentFrame.size.width > self.scrollView.frame.size.width) {
    contentFrame.size.width = self.scrollView.frame.size.width;
}

self.contentView.frame = contentFrame;

[self.scrollView addSubview:self.contentView];
self.scrollView.contentSize = self.contentView.frame.size;
4

3 回答 3

6

布局视图和设置滚动视图的适当时间contentSize是在运行循环的布局阶段。在这个阶段,UIKit 将layoutSubviews消息发送到任何被标记为需要布局并且在窗口中的视图。当各种事情发生时,视图会自动标记为需要布局,包括第一次添加到窗口层次结构时、给它一个新的子视图时以及它的大小发生变化时。setNeedsLayout您还可以通过发送消息手动将视图标记为需要布局。

当视图接收到layoutSubviews消息时,UIKit 已经发送layoutSubviews给任何需要它的视图的祖先(它的父视图和上层视图),并且它已经根据它的自动调整掩码或自动布局约束以及它自己的子视图调整了它的框架' 框架已经根据它们的自动调整大小掩码或自动布局约束进行了调整。

如果self.view已经是 的自定义子类UIView,最好的方法就是layoutSubviews在该类中覆盖。把你的布局代码放在那里,并在那里设置滚动视图contentSize

如果您没有使用自定义子类,并且您不想创建一个,那么您可以在视图控制器viewWillLayoutSubviewsviewDidLayoutSubviews方法中进行布局,如果您的部署目标是 iOS 5.0 或更高版本。您可能会猜到这些消息是何时发送的。:)

在自动旋转期间,所有这些消息(layoutSubviewsviewWillLayoutSubviewsviewDidLayoutSubviews)都在自动旋转的动画块中发送,因此如果您使用其中一种方法进行布局,您还可以获得在自动旋转动画期间对布局的更改进行动画处理的好处.

于 2012-10-17T23:54:53.740 回答
0

首先,如果您不想在旋转时调整视图大小,请检查自动调整大小蒙版。如果您在界面构建器中构建了视图,请检查它是否在超级视图发生变化时没有改变它的大小:

调整视图的属性

您可以UIViewController使用. 查看当前界面方向self.interfaceOrientation。如果您想手动设置视图,这可能会对您有所帮助。

此外,如果您需要手动调整大小,请在执行旋转之前(或之后)将所需的帧设置为您的视图:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
于 2012-10-17T23:30:25.590 回答
0

我建议查询状态栏方向以获取当前旋转viewDidLoad我建议不要依赖滚动视图的自动调整大小,因为它往往会变得棘手。检查状态栏,根据此按比例调整大小。

[UIApplication sharedApplication].statusBarOrientation

于 2012-10-17T23:41:29.050 回答