为什么在UIScrollView中将pagingEnabled设置为YES会在触摸子视图时自动滚动到上一页?

Kri*_*nan 2 uiscrollview uiscrollviewdelegate ios scroll-paging

我正在使用UIScrollView来显示许多子视图.以下是创建滚动视图的代码:

ScrollView = [[UIScrollView alloc]initWithFrame:CGRectZero];
ScrollView.delegate = self;
ScrollView.showsHorizontalScrollIndicator = NO;
ScrollView.showsVerticalScrollIndicator = NO;
ScrollView.clipsToBounds = YES;
ScrollView.scrollEnabled = YES;
ScrollView.pagingEnabled = YES;

CGFloat widthOfScroll= (maxTotalColumnsVisibleAtAnyPoint * widthOfSubView );

ScrollView.frame = CGRectMake(0, 0, widthOfScroll, heightOfSubView);

CGSize contentSizeHeaderView =  self.ScrollView.frame.size;
CGFloat contentSizeWidth =  self.totalSubViews * self.widthOfSubView;
contentSizeHeaderView.width =  contentSizeWidth;

[ScrollView setContentSize:contentSizeHeaderView];
Run Code Online (Sandbox Code Playgroud)

用于向ScrollView添加控件的代码和用于scrollView的事件处理程序的代码如下:

-(void)loadControlsInScroll{


    UIView *tempSubView = nil;
    CGFloat tempOriginX = 0;
    @autoreleasepool {


        for (int i = 0; i < self.totalSubViews; i++) {


            tempSubView = [dataSource viewForScroll:i];
            tempSubView.layer.borderColor = borderColor.CGColor;
            tempSubView.layer.borderWidth = kBorderWidth;
            tempSubView.frame = CGRectMake(tempOriginX, 0, widthOfSubView, heightOfSubView);
            tempOriginX = tempOriginX + widthOfSubView;

            [self.ScrollView addSubview:tempSubView];
        }

    }

}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
///Event handler
}
Run Code Online (Sandbox Code Playgroud)

我在此滚动视图中启用了分页.

让我们假设在最大值时,scrollView可以在其框架中保存8个子视图.

情况1:

滚动视图中添加了16个子视图.现在显示两页.滚动到两个页面都正常工作.触摸两个页面中的子视图不会导致任何不正确的行为.

案例2:

9个子视图被添加到滚动视图中.现在也是它的页面.第一页包含第1至第8个子视图.第二页包含第二至第九个子视图.现在触摸第1页中的子视图工作正常.触摸第2页调用UIScrollView的事件处理程序scrollViewDidScroll.

在此输入图像描述 在此输入图像描述

更多信息:

  1. 如果PagingEnabled设置为NO,则不会发生这种情况.

为什么即使没有手动完成滚动,也会调用此scrollViewDidScroll事件?此时还调用事件处理程序scrollViewWillBeginDragging?

更新1:

真正的问题是如果PagingEnabled为YES,则是否设置了scrollview的委托,在情况2中,滚动视图自动滚动到上一页.

Abi*_*ain 5

问题是UIScrollView的Paginenabled属性总是将scrollview滚动到其边界的宽度.因此,当您有9个子视图时,它会尝试滚动到第2页并显示2-9个子视图.实际上你的page1有子视图1-8,第二pgae只有9个子视图.所以真正的问题是UIScrollview的内容宽度应该与您的Pages数量成正比.在您的情况下,您的1页包含8个子视图.所以内容大小应该是UIScrollview的宽度*否.页面.

// noOfpages = No of pages in scrollview (Each page has 8 subviews)
// noOfSubviews
int noOfpages = 
if(noOfSubviews%8==0){
   noOfPages = noOfSubviews/8;

}else{
   noOfPages = noOfSubviews/8 + 1;
}
scrollview.contentSize = CGSizeMake(scrollview.frame.size.width*noOfPages,scrollview.frame.size.height); 
Run Code Online (Sandbox Code Playgroud)

这样,在第一页上滚动将带您查看9.然后向后滚动将返回到子视图1-8.