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

Iphone 如何使UIScrollView尊重包含的UIView的布局?,iphone,uiview,uiscrollview,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 scre

我使用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];    
 }

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

contentSize
必须在滚动视图中包含视图的矩形。即中所有可滚动控件的总大小。UIScrollView的框架决定了需要多少滚动才能让用户浏览所有内容。

contentSize
必须在滚动视图中包含视图的矩形。即中所有可滚动控件的总大小。UIScrollView的框架决定了需要多少滚动才能让用户浏览所有内容。

如果有导航栏或选项卡栏,则没有可用的“完整框架”。通常,使用
[UIScreen mainScreen]
作为布局信息的代码可能是错误的

此外,如果(例如)呼叫正在进行或已启用栓系,则状态栏可以更改大小

取而代之的是,对全帧使用任何sane值并启用自动调整大小:

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

...

sv.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;
编辑:您可能还需要对UIScrollView进行子类化,并实现
-setFrame:
,这样它还可以设置内容大小和
-layoutSubview
以进行正确的布局。

如果您有导航栏或选项卡栏,则没有可用的“完整框架”。通常,使用
[UIScreen mainScreen]
作为布局信息的代码可能是错误的

此外,如果(例如)呼叫正在进行或已启用栓系,则状态栏可以更改大小

取而代之的是,对全帧使用任何sane值并启用自动调整大小:

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

...

sv.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;

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

我已经解决了。问题的症结在于,滚动视图中的视图使用与滚动视图本身相同的帧进行初始化。当使用
半帧
初始化scrollView时,原点为(0,全屏大小的一半),这是正常的,因为这是相对于应用程序窗口本身的。但是,放置在scrollView中的视图(如
leftView
)被初始化为
halfFrame
,但在这种情况下,原点相对于scrollView,有效地将它们放置在屏幕之外。将原点设置为(0,0)可修复此问题:

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


我想出来了。问题的症结在于,滚动视图中的视图使用与滚动视图本身相同的帧进行初始化。当使用
半帧
初始化scrollView时,原点为(0,全屏大小的一半),这是正常的,因为这是相对于应用程序窗口本身的。但是,放置在scrollView中的视图(如
leftView
)被初始化为
halfFrame
,但在这种情况下,原点相对于scrollView,有效地将它们放置在屏幕之外。将原点设置为(0,0)可修复此问题:

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


恕我直言,我不确定我是否明白。“可滚动控件的总大小在”是否等于单个视图的3*帧宽度(因为有3个视图)?恕我直言,我不确定我是否遵循。“可滚动控件的总大小在”是否等于单个视图的3*帧宽度(因为有3个视图)?我理解您关于使用mainScreen作为帧大小的观点。但是,这不适用于任何帧大小(我发现),即使使用自动调整大小掩码也是如此。因此,根据需要进行子类化并实现-layoutSubviews。感谢您的输入。我发现了一个更简单的解决方案,我在下面贴了出来。我理解你关于使用主屏幕来确定帧大小的观点。但是,这不适用于任何帧大小(我发现),即使使用自动调整大小掩码也是如此。因此,根据需要进行子类化并实现-layoutSubviews。感谢您的输入。我发现了一个更简单的解决方案,我在下面发布了。