启用内容插入的UIScrollView分页工作很奇怪

我创build了带有内容插入的UIScrollView。

scrollView.frame = CGRectMake(-80, 180, 480, 190) self.scrollView.contentInset = UIEdgeInsetsMake(0, 160, 0, 160); self.scrollView.pagingEnabled = YES; [self.scrollView setContentSize:CGSizeMake(480, 190)]; // Add three Views [self.scrollView addSubview:view1]; [self.scrollView addSubview:view2]; [self.scrollView addSubview:view3]; [view1 setFrame:CGRectMake(0, 0, 160, 190)]; [view2 setFrame:CGRectMake(160, 0, 160, 190)]; [view3 setFrame:CGRectMake(320, 0, 160, 190)]; 

d

第一次, scrollView.contentOffset.x是-160.0

但奇怪的问题是,当我点击scrollView(黄色区域),内容偏移x值重置为0,并像这样显示。

在这里输入图像说明

我尝试过几次,但是在Scroll View上点击可以将内容偏移重置为0。

我怎样才能防止这个?

UIScrollView分页工作通过滚动scrollView(在你的情况下,页面宽度为480)的相同宽度的页面。 这意味着你有一个单一的页面(你仍然可以左右滚动,因为160内容插入)。

做这项工作的一个方法是:

 self.scrollView.frame = CGRectMake(80, 180, 160, 190); self.scrollView.clipsToBounds = NO; self.scrollView.contentInset = UIEdgeInsetsZero; self.scrollView.pagingEnabled = YES; [self.scrollView setContentSize:CGSizeMake(480, 190)]; 

这将正确绘制和滚动,但是,屏幕的边将不会交互(每边80像素,因为控制开始于frame.origin.x = 80,结束于80 + 160 = 240)。

第二个select是使用UIScrollViewDelegate提供的方法来自己处理分页。

 - (void)viewDidLoad { [super viewDidLoad]; // pageIndex must be declared as a class member - this is used to prevent skipping pages during scroll pageIndex = 0; self.scrollView.frame = CGRectMake(0, 180, 320, 190); self.scrollView.contentInset = UIEdgeInsetsMake(0, 80, 0, 80); self.scrollView.pagingEnabled = NO; self.scrollView.clipsToBounds = YES; [self.scrollView setContentSize:CGSizeMake(480, 190)]; self.scrollView.delegate = self; } - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ int pageWidth = 160; int pageX = pageIndex*pageWidth-scrollView.contentInset.left; if (targetContentOffset->x<pageX) { if (pageIndex>0) { pageIndex--; } } else if(targetContentOffset->x>pageX){ if (pageIndex<3) { pageIndex++; } } targetContentOffset->x = pageIndex*pageWidth-scrollView.contentInset.left; NSLog(@"%d %d", pageIndex, (int)targetContentOffset->x); } 

除了将clipToBounds设置为NO的第一种方法之外,我还需要对滚动视图边界之外的滚动做出反应。 所以我创build了ScrollForwarderView类,它是UIView的子类。

ScrollForwarderView.h

 #import <UIKit/UIKit.h> @interface ScrollForwarderView : UIView @property (nonatomic, weak) UIScrollView *scrollView; @end 

ScrollForwarderView.m

 ... - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if ([self pointInside:point withEvent:event]) { return _scrollView; } return nil; } 

然后将UIView与滚动视图上方的自定义类ScrollForwarderView放在一起,将scrollView属性链接到我的滚动视图,并很好地将用户事件转发到滚动视图。