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

我创建了具有内容插入的UIScrollView.
scrollView.frame = CGRectMake(-80,180,480,190)
self.scrollView.contentInset = UIEdgeInsetsMake(0,160,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,190)];
[view2 setFrame:CGRectMake(160,190)];
[view3 setFrame:CGRectMake(320,190)];

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

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

我尝试过几次,但是点击滚动视图会将内容偏移量重置为0.

我该如何防止这种情况?

解决方法

UIScrollView分页通过滚动与scrollView宽度相同的页面(在您的情况下为480个宽度的页面).这意味着您有1个单页(由于160内容插入,您仍然可以左右滚动).

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

self.scrollView.frame = CGRectMake(80,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).

第二个选项是通过使用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,320,190);
    self.scrollView.contentInset = UIEdgeInsetsMake(0,80,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);
}

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...