【问题标题】:Why setting pagingEnabled to YES in UIScrollView automatically scrolls to previous page when the sub views are touched?为什么在 UIScrollView 中将 pagingEnabled 设置为 YES 会在触摸子视图时自动滚动到上一页?
【发布时间】:2012-11-11 19:38:05
【问题描述】:

我正在使用 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];

向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
}

我已在此滚动视图中启用分页。

让我们假设最大滚动视图可以在其框架中容纳 8 个子视图。

案例 1:

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

案例 2:

9 个子视图被添加到滚动视图中。现在它也被拖页了。第一页包含第 1-8 个子视图。第二页包含第 2-9 个子视图。 现在在第 1 页中触摸子视图可以正常工作。在Page 2中触摸调用UIScrollView的事件处理函数scrollViewDidScroll。

更多信息:

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

为什么即使没有手动完成滚动,也会调用此 scrollViewDidScroll 事件?这个时候也调用了事件处理函数scrollViewWillBeginDragging?

更新 1:

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

【问题讨论】:

    标签: ios uiscrollview uiscrollviewdelegate scroll-paging


    【解决方案1】:

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

    这样,在第一页滚动将带您到视图 9。向后滚动将带您回到子视图 1-8。

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 2014-01-08
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多