0

我找到了一个循环滚动视图的好解决方案,但我也使用 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,一切正常,但页面计算..(当滚动视图调整自身大小时,它调用scrollViewDidScroll我计算 pageNumber 的位置:

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

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

先感谢您!

4

1 回答 1

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;

希望有所帮助

于 2013-11-14T15:00:31.080 回答