9

所以我有一个 UICollectionView,每个单元格都有自定义 UIViews。UIView 占据了整个屏幕,您可以水平导航到 4 个不同的 UIView/单元格中的每一个。这一切都很好,并使用寻呼机来指示您在 collectionview 的哪个页面上。

我环顾了谷歌等,看看是否可以在您导航通过最后一个单元格后让它循环回到开头。例如:

我从第 3 个单元格开始,导航到第 4 个单元格,然后当我向右滑动时,它将返回第一个单元格(寻呼机将反映您在第一页上)并从那里继续。

这很容易做到吗?还是我错过了什么?

谢谢,杰克

4

2 回答 2

4

您只需要 3 个 UIView 来保存当前视图左侧的图像、当前视图右侧的图像以及当前屏幕上的中间视图。

假设我们有 UIImages ABCD 和 UIViews 1 2 和 3

我们正在查看视图 2,图像 B。左页将带我们到图像 A,右页将带我们到图像 C。

当您向左/向右滑动页面时,视图 3 成为带有图像 C 的屏幕视图。当分页停止时,您交换视图内容,因此用户实际上再次查看中间的 UIView2,带有图像 C。视图 1 具有图像B,视图 3 有图像 D。

再次向右滚动,然后进行同样的随机播放。现在你有

View 1 -> image C
View 2 -> image D
View 3 -> image A

下一页右

View 1 -> image D
View 2 -> image A
View 3 -> image B

以此类推,在任一方向上无止境

2011 年有一个关于这个主题的精彩 WWDC 视频。它值得挖掘。这是 UIScrollView 演示视频文档为 PDF)您不需要集合视图来执行此操作,尽管没有理由不应该...

于 2013-01-10T02:13:42.120 回答
3

准备好迎接这种热度了吗?

因此,在我的主视图控制器的 viewDidLoad 中,我确定了要加载到数组中 uicollectionview 单元格中的视图:

NSArray *vcs = [@"view5", @"view1", @"view2", @"view3", @"view4", @"view5", @"view1"]

我还将我们的 pagecontrol 计数设置为:

self.pageControl.numberOfPages = vcs.count - 2; // for the fake first and last cells

然后我在主视图控制器的 viewDidLoad 中实例化视图控制器,并将 collectionview 的 alpha 设置为 0。然后在我们的 scrollViewDidEndDecelerating 中我处理轮播(从最后一个单元格到第一个单元格,从第一个单元格到最后一个)并更新 pageControl 以反映“真实”的页码。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // Snaps into the cell    
    CGFloat pageWidth = scrollView.frame.size.width;
    float fractionalPage = scrollView.contentOffset.x / pageWidth;
    NSInteger page = lround(fractionalPage);

    self.pageControl.currentPage = page - 1; // because our first cell is the last cell for animation purposes only

    // Carousel from first to last and last to first while updating pagecontrol
    if (page == 0) {
        [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.activeGaugeClusters.count - 2 inSection:0]
                                    atScrollPosition:UICollectionViewScrollPositionLeft
                                            animated:NO];
        // Set our pagecontrol circles to the appropriate page indicator        
        self.pageControl.currentPage = self.activeGaugeClusters.count - 2;

    } else if (page == self.activeGaugeClusters.count -1) {
        [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]
                                    atScrollPosition:UICollectionViewScrollPositionLeft
                                            animated:NO];
        self.pageControl.currentPage = 0;
    }
}

然后在 collectionview 实现中,我执行以下操作:

numberOfItemsInSection = vcs.count

和 viewDidAppear 用于加载第一个单元格(无论是 indexPath.row == 1 或 2 或 3 处的单元格...(1 是第一个真实页面而不是 0)

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.lastGaugePanel inSection:0]
                                atScrollPosition:UICollectionViewScrollPositionLeft
                                        animated:NO];
    self.pageControl.currentPage = self.lastGaugePanel - 1;
    [UIView animateWithDuration:0.5 animations:^{
        self.collectionView.alpha = 1.0;
    }];
}

我想大概总结一下。主 vc 和 collectionview 的其余实现都是标准的。所以现在我有一个集合视图,可以加载其他视图和它们的 VC,每个视图都有自己的动画或其他内容。我将 indexPath.row 保存到 NSUserDefaults 以便我离开时所在的单元格是下一次加载时显示的第一个单元格。

希望这对某人有所帮助,我知道它对我有用,不幸的是,不鼓励使用 3rd 方库,所以我不得不建立这个坏男孩(在@He Was 的帮助下,再次感谢!)

于 2013-01-12T01:44:59.967 回答