6

所以我有一個UICollectionView與每個單元格的自定義UIViews。 UIView佔用了整個屏幕,您可以水平導航到4個不同的UIView /單元中的每一個。這一切都正常工作,並使用尋呼機來指示您所在的collectionview的哪個頁面。UICollectionView水平連續循環

我瀏覽過谷歌和類似的東西,看看我可以得到它循環回到開始後瀏覽傳遞最後一個單元格。例如:

我從第三個單元格開始,導航到第四個,然後當我向右滑動時,它將返回到第一個單元格(pager將反映您在第一個頁面上)並繼續從那裏開始。

這很容易嗎?或者我錯過了什麼?

感謝, 傑克

回答

3

你只需要3個UIViews,將圖像堅持當前視圖,圖像當前視圖的右邊,中間來看,一個是當前的左在屏幕上。

因此,可以說,我們有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 

等等,循環往復在任一方向

有關於這個問題的一個很好的WWDC視頻從2011年開始了它的價值挖掘出。 It's the UIScrollView demo videoDocumentation as PDF)你不需要集合視圖來做到這一點,雖然沒有理由你不應該...

+0

我恐怕它比視圖中的圖像複雜一些,這些視圖是從故事板加載的(與使用nibs並加載它們相反),並且它們都有自己的視圖控制器,並且這些視圖可以被插入。此外,強烈建議使用uicollectionview,儘管不是絕對強制性的,以保持與其他應用程序的一致。你認爲我可以將單元格的數量設置爲非常高的數字,然後將內容和全部內容移至下一個單元格? (我認爲我在某個地方看到過,但是它必須有性能問題沒有?) – JakeTheBraek

+0

即使它更復雜,原理也應該是相同的,當收集視圖處於靜止狀態時,您正在洗牌您的支持數據。我已經在表視圖中的表視圖的滾動視圖,表格視圖和層次結構上成功完成了這一任務,沒有任何問題。如果你不想混淆你的支持數據,你可以將它拖入一個臨時數據存儲中,並將其混淆?我也做過大量的單元格事情,但這只是爲了在我們實時滾動數據的同時保持幻覺。這永遠不會是無懈可擊的。 – foundry

+0

感謝您的幫助他是,這裏的理論聽起來很合理,應該翻譯好我的collectionview。我將嘗試在最後一個單元格之後複製第一個單元格,反之亦然,然後鎖定單元格。一旦完成減速生病,根據方向將用戶移至「真實」第一個單元或「真實」最後一個單元。保持我的手指交叉。 – JakeTheBraek

2

好吧準備好了這個熱度?

所以在我的主視圖控制器的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中的viewcontrollers以及collectionview的alpha設置爲0.然後在我們的scrollViewDidEndDecelerating中處理Carousel(從最後一個單元格到第一個單元格和最後一個單元格)並更新pageControl以反射ct「真實」頁碼。

- (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,以便我離開時所在的單元格是下一個加載的第一個單元格。

的希望這可以幫助別人,我知道它確實對我來說,不幸的是,使用第三方庫的很沮喪,所以我必須建立這個壞小子了(再次從@He幫助下,謝謝!)

+0

你想要我的矩陣版本!我在tableViews中使用了重疊的tableViews和tableViews .... – foundry