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

Ego*_*r T 15 objective-c uiscrollview ios

我用内容插件创建了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)];
Run Code Online (Sandbox Code Playgroud)

d

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

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

在此输入图像描述

我尝试了几次,但点击Scroll View会将内容偏移重置为0.

我怎么能阻止这个?

ale*_*x-i 14

UIScrollView通过滚动具有相同宽度的scrollView的页面(在480宽度的情况下页面)进行分页.这意味着您有1个单页(由于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)];
Run Code Online (Sandbox Code Playgroud)

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

第二种选择是通过使用提供的方法自己处理分页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);
}
Run Code Online (Sandbox Code Playgroud)

  • 它不像那样工作.在`pagingEnabled`的文档中,它说:`如果此属性的值为YES,滚动视图在用户滚动时停止在滚动视图边界的倍数上.边界不受`contentInset`的影响. (5认同)