【问题标题】:Loop UIScrollView with PageController使用 PageController 循环 UIScrollView
【发布时间】:2013-11-14 14:23:26
【问题描述】:

我找到了一个很好的解决方案来循环我的滚动视图,但我也使用 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];
}

然后我在scrollViewDidEndDecelerating 中调用rotateIfNecessary,一切正常,但是页面正在计算..(当滚动视图调整自身大小时,它调用scrollViewDidScroll 我计算pageNumber:

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

当滚动视图循环时,pageControl 不显示正确的页码。 有什么想法吗?

提前谢谢你!

【问题讨论】:

    标签: ios objective-c loops uiscrollview scrollview


    【解决方案1】:

    让我们开始吧:

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

    scrollView.contentOffset.x == 0 时条件为真,那你在 scrollView.bounds.size.width 中添加 scrollView.contentOffset.x(肯定是 = 0)有什么用呢?

    更新

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

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

    如果是 - 页面的问题是因为您一直在更改 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;
    

    希望有帮助

    【讨论】:

    • 页面计算并不总是正确的。我必须更新 didEndDecelerating 方法中的页码。但这个想法很好,也不需要 + 1,因为我设置了 pageController 的 currentPageNumber,这也是一个索引(从 0 开始)。
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2011-11-24
    • 2011-10-07
    • 2013-01-15
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多