使用PageController循环UIScrollView

时间:2013-11-14 14:23:26

标签: ios objective-c loops uiscrollview scrollview

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

我在滚动视图滚动时更改pageControl.currentPage属性,因此如果滚动滚动视图超过一半,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,一切正常,但页面正在计算..(当scrollview调整自身大小时,它会调用scrollViewDidScroll来计算pageNumber:

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

当scrollView循环时,pageControl不会显示正确的页码。 有什么想法吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

让我们从:

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

条件为真,那么你将scrollView.contentOffset.x(它肯定是0)添加到scrollView.bounds.size.width?

已更新

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

如果我正确理解你,例如,向右旋转 - 最后一个元素成为第一个,你想要显示最后页面吗?

如果是 - 页面的问题是因为你一直在改变contentOffset并且还改变了滚动视图的“数据源”,所以contentOffset和单独的DashboardFrameViewController之间没有相关性 - 同样的DashboardFrameViewController可以在不同的时刻处于不同的偏移时间所以你必须根据别的东西来计算页面N.

例如:

ivar商店初始控制器(初始订单)的某处:

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

然后你需要一些方法来发现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;

希望帮助