Iphone 如何使UIScrollView尊重包含的UIView的布局?
我使用UIView控制视图的布局(以及视图控制器)。我希望UIScrollView只使用垂直屏幕的一半。如果我使用屏幕的上半部分,而不是下半部分,那就可以了 以下是UIViewController中的相关代码: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
- (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。感谢您的输入。我发现了一个更简单的解决方案,我在下面发布了。