如何使用“超大”页面创建分页UIScrollView

时间:2011-04-18 14:11:59

标签: iphone uiscrollview uiscrollviewdelegate

是否有建议的方法来创建页面UIScrollView,其页面宽度超过UISrollView的边界?

我需要这样的东西。

enter image description here

第2页内的正常滚动和分页模式,页面边缘有“橡皮带”效果。

对我来说,分页效果看起来有点复杂,如果你快速翻动就转到下一页,如果你滑得慢,你会看到边缘的新页面,并且只有在某一点之后页面才会被更改。

也许有人可以对处理这个问题的方法有所了解,这是否可以仅使用UIScrollViewDelegate方法或者我必须进行子类化?

3 个答案:

答案 0 :(得分:2)

我印象深刻。这实际上比我在开始时想象的容易得多。

简单的解决方案是将每个页面封装在非分页滚动视图中。并做了。无需实现UIScrollViewDelegate,无需子类。三行额外代码

对于常规尺寸的页面,我有类似的东西:

UIView *myCustomView = [[[UIView alloc] initWithFrame:CGRectMake(totalWidth, 0, width, height)] autorelease];
[mainScroller addSubview:myCustomView];
totalWidth += width;

现在我有了这个:

UIView *myCustomView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, bigWidth, height)] autorelease];
UIScrollView *secondaryScroller = [[[UIScrollView alloc] initWithFrame:CGRectMake(totalWidth, 0, width, height)] autorelease];
[secondaryScroller setContentSize:myCustomView.frame.size];
[secondaryScroller addSubview:myCustomView];
[mainScroller addSubview:secondaryScroller];
totalWidth += width;

三行。惊人的。


视图层次结构:

<UIScrollView: 0x4b32eb0; frame = (0 0; 768 1004); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x4b32d00>; contentOffset: {0, 0}>
   | <UIScrollView: 0x4b32710; frame = (0 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b35580>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b33f70; frame = (0 0; 1352 1004); layer = <CALayer: 0x4b16c20>>
   | <UIScrollView: 0x4b34790; frame = (768 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b33e10>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b30fa0; frame = (0 0; 789 1004); layer = <CALayer: 0x4b329f0>>
   | <UIScrollView: 0x4b34920; frame = (1536 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b33180>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b30d00; frame = (0 0; 1398 1004); layer = <CALayer: 0x4b33120>>
   | <UIScrollView: 0x4b31fe0; frame = (2304 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b32170>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b34c50; frame = (0 0; 863 1004); layer = <CALayer: 0x4b31f80>>
   | <UIScrollView: 0x4b32460; frame = (3072 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b325f0>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b323d0; frame = (0 0; 1064 1004); layer = <CALayer: 0x4b32400>>

答案 1 :(得分:0)

据我所知,使用scrollviews分页属性无法直接实现此目的。

您必须实现自己的UIScrollView子类,并且需要在实现文件中实现:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event; 

使用contentOffset属性计算滚动视图滚动的程度。

并利用UIScrollViews的scrollRectToVisible:来实现您自己的自定义滚动功能。

[self scrollRectToVisible:CGRectMake(horizontalScrollAmount,virticalScrollAmount,rectWidth,rectHeight) animated:NO];

事件链将是这样的:记录开始触摸的位置,如果触摸移动,通过检查其x / y坐标是否大于或小于其起始位置来找出它移动的方向,如果被触摸在屏幕上移动了足够的金额,则使用scrollRectToVisible:按指定的分页大小滚动视图。

答案 2 :(得分:0)

我使用了本教程 -

http://www.edumobile.org/iphone/iphone-programming-tutorials/pagecontrol-example-in-iphone/

如果要创建更大的页面,可以在本教程中增加PageControlExampleViewControl的视图大小。让我们说它的宽度为360而不是默认的320。