ios - 为什么在 UIScrollView 中将 pagingEnabled 设置为 YES 会在触摸 subview 时自动滚动到上一页?

标签 ios uiscrollview uiscrollviewdelegate scroll-paging

我正在使用 UIScrollView 来显示大量 subview 。下面是创建 ScrollView 的代码:

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];

将控件添加到 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
}

我已在此 ScrollView 中启用分页。

让我们假设scrollView在其框架中最多可以容纳8个 subview 。

案例1:

16 个 subview 被添加到 ScrollView 中。现在显示两个页面。滚动到两个页面都可以正常工作。触摸两个页面中的 subview 不会导致任何不正确的行为。

案例2:

9 个 subview 被添加到 ScrollView 中。现在它也被拖了。第一页包含第 1-8 个 subview 。第二页包含第 2-9 个 subview 。 现在,触摸第 1 页中的 subview 可以正常工作。第2页中的触摸会调用UIScrollView的scrollViewDidScroll事件处理程序。

enter image description here enter image description here

更多信息:

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

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

更新1:

真正的问题是,如果PagingEnabled为YES,那么无论是否设置了scrollview的delegate,在情况2中,scrollview都会自动滚动到上一页。

最佳答案

问题是 UIScrollView 的 Paginenabled 属性总是将 ScrollView 滚动到其边界的宽度。因此,当您有 9 个 subview 时,它会尝试滚动到第二页并显示 2-9 个 subview 。实际上,您的 page1 有 subview 1-8,而第二个 pgae 只有 9 个 subview 。所以真正的问题是 UIScrollview 的内容宽度应该与页面数量成正比。在您的情况下,您的 1 页包含 8 个 subview 。所以内容大小应该是 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); 

这样,在第一页上滚动将带您到 View 9。向后滚动将带您返回 subview 1-8。

关于ios - 为什么在 UIScrollView 中将 pagingEnabled 设置为 YES 会在触摸 subview 时自动滚动到上一页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13529074/

相关文章:

ios - 使用 UIScrollView 更改图像的 alpha

iphone - UIScrollView ContentOffset 未到达屏幕边缘

ios - 如何将所有 UISlider 事件链接到一个方法?

ios - UIView 与 UITableView 的操作重复

ios - 快速滚动后,粘性 ScrollView subview 的框架不正确。可编译的例子

ios - 滚动 UITableView 时如何创建 NSLayoutConstraint

ios - 以编程方式从左向右滚动UIScrollView反向

ios5 - IOS。如何将 UIScrollview 滚动限制在有限的范围内?

ios - 如何从 ScrollView 内的自定义组件内部使用prepareForSegue?

ios - 有什么方法可以让 iOS 中的触摸保持活力?