2012-10-17 64 views
1

我有一个UIViewController,纵向配有iPad xib。当我的iPad处于横向模式时,我将该视图控制器放入我的UISplitViewController的详细信息窗格中,它会自动调整大小以适合哪种方式。当纵向xib调整为横向时,需要更改UIScrollView contentSize

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

当我已经在横向加载UIViewController时,-didRotateFromInterfaceOrientation:方法和与它关联的其他方法不会被调用,所以何时何地能够正确设置滚动视图的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; 
+0

你能发布你设置内容大小的代码吗?它在viewDidLoad中吗? – atxe

+0

是的,在viewDidLoad中我添加了代码。 –

+0

旋转时,您的UIScrollView的内容大小真的在变化吗?内容是不是相同和相同的大小? – atxe

回答

5

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

由视图接收layoutSubviews消息的时间,UIKit中已经发送layoutSubviews到任何一个需要它的视图的祖先(它的父及以上),并且它已经有其框架来调整是根据它的自动尺寸调整掩模或自动布局约束和它自己的子视图的框架已经根据它们的自动调整掩码或自动布局约束进行了调整。

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

如果你不使用自定义的子类,你不希望创建一个,那么你可以做你的视图控制器的viewWillLayoutSubviewsviewDidLayoutSubviews方法的布局,如果你部署目标是安装iOS 5.0或更高版本。您可能猜测这些消息何时发送。 :)

在自转,所有这些消息(layoutSubviewsviewWillLayoutSubviewsviewDidLayoutSubviews)都在自转的动画块内发送,所以如果你在这些方法中的一个做你的布局,您还可以获得利益的变化您的布局将在自动旋转动画过程中进行动画制作。

+0

-viewDidLayoutSubviews听起来很完美,但我需要支持回到iOS4.3。任何建议iOS4?我没有使用任何自定义视图。 –

+0

我会做一个'UIView'的子类并实现'layoutSubviews'。 –

+0

必须有一种方法可以确定我的视图控制器的实际大小,尽管... –

0

首先,如果你不想让旋转检查自动调整大小面具调整时的观点。如果建在界面生成器视图然后检查它不改变它的大小时,上海华做:

Sizing properties of a view

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

此外,如果您需要手动调整大小,然后前(或后)设置所需的帧你的意见被旋转:

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

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

[UIApplication sharedApplication].statusBarOrientation

相关问题