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

Ken*_*and 1 uiscrollview ios

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

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

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

我只希望我的滚动视图垂直滚动,所以我想确保我的滚动视图里面内容查看重新适合在任何方向它是在视图控制器的宽度.

无论我检查什么.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;
Run Code Online (Sandbox Code Playgroud)

rob*_*off 6

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

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

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

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

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