当纵向xib调整为横向时,需要更改UIScrollView contentSize

时间:2012-10-17 22:42:18

标签: ios uiscrollview

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

但是,当我在-viewDidLoad中配置我的视图时,视图的最终大小尚未处于横向/大小。

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

我只想让我的滚动视图垂直滚动,所以我想确保我在scrollView中的contentView以任何方向重新适应视图控制器的宽度。

无论我检查什么.frame或.bounds,无论是我的视图,我的滚动视图,还是我的SplitViewController的详细视图控制器都显示我的ACTUAL大小。当使用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;

3 个答案:

答案 0 :(得分:6)

布局视图和设置滚动视图contentSize的正确时间是在运行循环的布局阶段。在此阶段,UIKit将layoutSubviews消息发送到任何已标记为需要布局且位于窗口中的视图。当各种事情发生时,视图会自动标记为需要布局,包括首次添加到窗口层次结构时,给定新的子视图时,以及其大小更改时。您还可以通过发送setNeedsLayout消息手动将视图标记为需要布局。

当一个视图收到layoutSubviews消息时,UIKit已经将layoutSubviews发送到需要它的任何视图的祖先(它的superview和up),并且它已经调整了它的帧基于其自动调整遮罩或自动布局约束,它自己的子视图的帧已根据其自动调整遮罩或自动布局约束进行调整。

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

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

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

答案 1 :(得分:0)

首先,如果您不希望在旋转时调整视图大小,请检查自动调整大小的掩码。如果您在界面构建器中构建了视图,那么在superview执行时检查它是否没有改变它的大小:

Sizing properties of a view

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

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

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;

答案 2 :(得分:0)

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

[UIApplication sharedApplication].statusBarOrientation