2012-11-26 65 views
7

我們有一個UICollectionView,其自定義佈局與UITableView非常相似(它垂直滾動)。所述UICollectionView同時僅顯示3細胞,用它們中的一個作爲當前激活的細胞:(這裏的活動單元格是#2)在UICollectionView/UITableView中設置scrollView的偏移量會導致過早消失的單元格

[ 1 ] 
[*2*] 
[ 3 ] 

的細胞是大致280點高,所以只有活動小區是充分在屏幕上可見。用戶不直接滾動視圖進行導航,而是水平滑動活動單元格以前進到下一個單元格。然後,我們做一些花哨的動畫和滾動UICollectionView所以下一個單元是在「主動」地位,從而使其成爲活躍之一,移動舊的路程,造就下一個單元格中的隊列:

[ 2 ] 
[*3*] 
[ 4 ] 

這裏的問題是設置UICollectionView的偏移量。我們目前將它設置在一個UIView動畫塊(self.collectionView.contentOffset = targetOffset;)以及其他三個動畫屬性中,這些屬性通常很好,但是會導致第一個單元(前一個活動的單元,後一種情況下爲#2)在動畫一消失甚至在延遲間隔完成之前開始運行。這絕對不是理想的。

我想過一些解決方案,但不能找出最好的一個:

  1. 荒謬擴大UICollectionView的框架,以適應五個格,而不是三個,這樣就可以迫使保持細胞記憶即使他們在屏幕外。我已經嘗試過這一點,它的工作原理,但它聽起來像一個非常骯髒的黑客。

  2. 拍攝消失的單元格的渲染內容的快照,將其放入UIImageView中,將該UIImageView添加爲scrollView的子視圖,就在該單元格離開舊單元格的完全相同位置之前,將其刪除一旦動畫結束。聽起來不像以前的選擇那麼糟糕(至少在記憶方面),但還是有點不好意思。我也不知道完成這件事的最佳方法,請指出我的方向。

    1. 切換到UIScrollView的setContentOffset:animated:。我們實際上已經習慣了這一點,並且它修復了消失的單元問題,但是與其他UIView動畫並行運行顯然會引起主線程的注意,從而在單核設備(iPhone 3GS/4)。它也不允許我們改變動畫的持續時間或緩動,所以感覺與其他動作不同步。如果我們可以找到一種方法使其與UIView塊動畫協調工作,那麼仍然是一個選項。

    2. 切換到UICollectionView的scrollToItemAtIndexPath:atScrollPosition:animated:。還沒有嘗試過,但它有一個很大的缺點:對於目標滾動位置:UICollectionViewScrollPositionTop,UICollectionViewScrollPositionCenteredVerticallyUICollectionViewScrollPositionBottom只需要3個可能的常量(至少適用於這種情況)。活動單元格可以改變其高度,但它始終必須距離窗口頂部35個點,並且這些選項不能提供足夠的控制來完成設計。它也可能與3.1一樣有問題。仍然是一個選擇,因爲可能有辦法繞過滾動位置的東西,我不知道,它可能不會有與主線程相同的問題,這似乎不太可能。

任何幫助將不勝感激。請詢問是否需要澄清。非常感謝!

回答

4

我去了#2。下面是確實的渲染和存儲的片段:

UIGraphicsBeginImageContext(theCell.bounds.size); 
[theCell.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *renderedCellImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

方法的其餘部分是如我上面所描述的,有一點需要注意相當多:這有實際使用的圖像之前完成,並在後臺線程,因爲在iPhone 4上渲染最多可能需要1秒。希望這有助於某人。

-1

LongShot:嘗試將UIView動畫塊選項設置爲UIViewAnimationOptionBeginFromCurrentState

[UIView animateWithDuration:1 
         delay:0 
        options:UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ } 
       completion:^(BOOL completed){ } ]; 
+0

感謝您的回答。原來,這個區塊已經有了這個選擇,似乎沒有什麼區別。 – radutzan

+0

這也沒有幫助我。 –

2

通過在動畫塊中設置內容偏移量之後立即重新加載單元格,我使單元格保持可見。

UIView.animateWithDuration(0.3) { 
    self.collectionView.contentOffset = newOffset 
    self.collectionView.reloadItemsAtIndexPaths(willDisappearIndexPaths) 
} 
相關問題