如何使UIScrollView尊重包含UIView的布局?

时间:2010-11-22 22:28:26

标签: iphone uiview uiscrollview

我正在使用UIView来控制视图的布局(以及视图控制器)。我希望UIScrollView只使用一半的垂直屏幕。如果我使用屏幕的上半部分,而不是下半部分,则工作正常。

以下是UIViewController的相关代码:

 - (void)loadView {
CGRect fullFrame = [[UIScreen mainScreen] applicationFrame]; 
//trying to put the scroll view on the bottom half of the screen, but does not work.
CGRect halfFrame = CGRectMake(0, fullFrame.size.height / 2 ,
    fullFrame.size.width, fullFrame.size.height / 2);
//use this instead for the scroll view to go to the top half of the screen (and work properly)
//CGRect halfFrame = CGRectMake(0, 0 , fullFrame.size.width, fullFrame.size.height / 2);

 UIScrollView* sv = [[UIScrollView alloc] initWithFrame:halfFrame]; 
[sv setContentSize:CGSizeMake(3 * halfFrame.size.width, halfFrame.size.height)];

CGRect stencilFrame = halfFrame;
UIView *leftView = [[UIView alloc] initWithFrame:stencilFrame];

stencilFrame.origin.x += stencilFrame.size.width;
UIView *centerView = [[UIView alloc] initWithFrame:stencilFrame];

stencilFrame.origin.x += stencilFrame.size.width;
UIView *rightView = [[UIView alloc] initWithFrame:stencilFrame];

//mix up the colors
[leftView setBackgroundColor:[UIColor redColor]];
[centerView setBackgroundColor:[UIColor greenColor]];
[rightView setBackgroundColor:[UIColor blueColor]];

//add them to the scroll view
[sv addSubview:leftView];
[sv addSubview:centerView];
[sv addSubview:rightView];

//turn on paging
[sv setPagingEnabled:YES];

UIView *containerView = [[UIView alloc]initWithFrame:fullFrame];
[containerView addSubview:sv];
[self setView:containerView];    
 }

提前感谢您的任何建议或帮助。

3 个答案:

答案 0 :(得分:1)

我明白了。问题的关键在于滚动视图中的视图使用与滚动视图本身相同的框架进行初始化。当使用halfFrame初始化scrollView时,原点是(0,整个屏幕大小的一半),这是好的,因为它是相对于应用程序窗口本身。但是,放在scrollView中的视图(如leftView)初始化为halfFrame,但在这种情况下,原点相对于scrollView,有效地将它们放在屏幕上。将原点设置为(0,0)可修复此问题:

  

CGRect stencilFrame = CGRectMake(0,0,fullFrame.size.width,fullFrame.size.height / 2);

答案 1 :(得分:0)

contentSize必须包含滚动视图内的视图矩形。也就是说,所有可滚动控件的总大小。 UIScrollView的框架决定了让用户浏览所有内容需要多少滚动。

答案 2 :(得分:0)

如果您有导航栏或标签栏,则没有“全帧”可用。通常,使用[UIScreen mainScreen]表示布局信息的代码可能不对。

此外,如果(例如)正在进行呼叫或启用了网络共享,状态栏可以更改大小。

相反,对全帧使用任何合理的值并启用自动调整:

CGRect fullFrame = {{0,0}, {320,480}};

...

sv.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;

编辑:您可能还需要对UIScrollView进行子类化并实现-setFrame:,以便它还设置内容大小并-layoutSubviews来执行正确的布局。