使用PageController循环UIScrollView

肯尼耶沃

我找到了一个循环滚动视图的好方法,但是我也使用UIPageControl来显示实际页面的编号。

当scrollview滚动时,我更改了pageControl.currentPage属性,因此,如果滚动scrollview超过一半,则pageControl将显示新页面。我想保留此功能,但使用我的实际代码,pageNumber不正确。我想我应该使用这个:https : //github.com/gblancogarcia/GBInfiniteScrollView但是我无法使其工作...

这是我的代码:

-(void)rotateIfNecessary{
    if(scrollView.contentOffset.x == 0) {
        CGPoint newOffset = CGPointMake(scrollView.bounds.size.width+scrollView.contentOffset.x, scrollView.contentOffset.y);
        [scrollView setContentOffset:newOffset];
        [self rotateViewsRight];
    }
    else if(scrollView.contentOffset.x == (scrollView.contentSize.width - scrollView.frame.size.width) ) {
        CGPoint newOffset = CGPointMake(scrollView.contentOffset.x-scrollView.bounds.size.width, scrollView.contentOffset.y);
        [scrollView setContentOffset:newOffset];
        [self rotateViewsLeft];
    }
}

-(void)rotateViewsRight {
    NSMutableArray* controllers = [DashboardFrameUtil getFrameViewControllers];
    DashboardFrameViewController *endView = [controllers lastObject];
    [controllers removeLastObject];
    [controllers insertObject:endView atIndex:0];
    [self resizePages];
}

-(void)rotateViewsLeft {
    NSMutableArray* controllers = [DashboardFrameUtil getFrameViewControllers];
    DashboardFrameViewController *endView = [controllers firstObject];
    [controllers removeObjectAtIndex:0];
    [controllers addObject:endView];
    [self resizePages];
}

然后我叫rotateIfNecessary我的scrollViewDidEndDecelerating,一切工作正常,但页面计算。(当滚动视图自身的大小,它会调用scrollViewDidScroll,我计算PAGENUMBER:

CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
pageControl.currentPage = page;

当scrollView循环时,pageControl没有显示正确的页码。任何的想法?

先感谢您!

印第安人

让我们开始:

if(scrollView.contentOffset.x == 0) {
        CGPoint newOffset = CGPointMake(scrollView.bounds.size.width+scrollView.contentOffset.x, scrollView.contentOffset.y);
        ...
    }

当scrollView.contentOffset.x == 0时,条件为true,那么,为什么要向scrollView.bounds.size.width添加scrollView.contentOffset.x(肯定为0)?

更新

我没有运行代码-可能会出现一些错误

例如,如果您对我正确理解,请向右旋转-最后一个元素成为第一个元素,并且希望显示LAST页面?

如果是-页面的问题是因为您一直在更改contentOffset并还更改滚动视图的``数据源'',所以contentOffset与各个DashboardFrameViewController之间没有关联-同一DashboardFrameViewController在不同的时刻可以处于不同的偏移量。因此,您必须根据其他内容来计算第N页。

例如:

在ivar中的某个位置存储初始控制器(具有初始顺序):

- (void)viewDidLoad {
        [super viewDidLoad];
        _initialControllers = [[DashboardFrameUtil getFrameViewControllers] copy];
}

那么您需要某种方法来发现当前可见的vc或最接近中心的vc(并将其存储在ivar _currentlyVissibleVC中),例如:

- (DashboardFrameViewController *)vissibleVC {
     for (DashboardFrameViewController *vc in _initialControllers){
          if (CGRectContainsPoint(vc.frame, CGPointMake(scrollView.contentOffset.x + scrollView.bounds.size.width/2, scrollView.contentOffset)){
               _currentlyVissibleVC = vc;
               return;
          }
     }
}

那么您可以计算页数:

int pageN = [_initialControllers indexOfObject:_currentlyVissibleVC] + 1;

希望有所帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章