2011-04-18 78 views
6

是否有建议的方式来创建页面比UISrollView的边界更宽的分页UIScrollView?如何用“超大”页面创建分页UIScrollView

我需要这样的东西。内第2页和寻呼模式

enter image description here

正常滚动与在页面上的边缘上的“橡皮”的效果。

对于我来说,分页效果看起来有点复杂,如果你快速地轻弹你转到下一页,如果你慢地滑动,你会在边缘看到新的页面,并且只有在某个点后页面被改变。

也许有人可以阐明处理这个问题的方法,这是甚至可能的唯一使用UIScrollViewDelegate方法或我必须继承?

回答

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>> 
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:以指定的分页尺寸滚动视图。