2013-06-12 45 views
1

我通過更改數據源來交換顯示在集合視圖中的數據。這是作爲標籤式界面的一部分完成的。當新數據加載時,我想刷新滾動指標以告訴用戶在視口外還有更多數據。更改數據源後UICollectionView的滾動滾動指示器

立即

否則立即不起作用,因爲集合視圖還沒有加載的數據尚未:

collectionView.dataSource = dataSource2; 
[collectionView flashScrollIndicators]; // dataSource2 isn't loaded yet 

dispatch_async

派遣flashScrollIndicators呼叫後沒有按不管用:

collectionView.dataSource = dataSource2; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [collectionView flashScrollIndicators]; // dataSource2 still isn't loaded 
}); 

performSelector:withObject:afterDelay:

定時延遲之後執行flashScrollIndicators不工作(我看到其他地方的SO),但是示滾動指標,導致有些滯後。我能降低延遲,但現在看來似乎只會導致競爭條件:

collectionView.dataSource = dataSource2; 
[collectionView performSelector:@selector(flashScrollIndicators) withObject:nil afterDelay:0.5]; 

有沒有我可以勾上儘快集合視圖回升閃爍滾動指標回調調整新的數據並調整內容視圖的大小?

+1

你嘗試調用'[的CollectionView重新載入數據]'後設置新的數據源,並在發送'flashScrollIndicators'之前? –

+0

你也許可以嘗試使用一個塊[像這樣](http://stackoverflow.com/a/10817187/1367622)重新加載數據並在完成時調用flashScrollIndicators。 –

+0

緊接在'flashScrollIndicators'之前調用'reloadData'也不起作用,正如[zvjerka24]所述(http://stackoverflow.com/questions/1483581/get-notified-when-uitableview-has-finished-asking-for -data/10817187#comment20638630_10817187)。 –

回答

3

子類化UICollectionView和覆蓋layoutSubviews可以是一個解決方案。您可以撥打收藏上的[self flashScrollIndicators]。問題是layoutSubviews在多種情況下被調用。

  1. 最初時創建的收集和數據源分配。
  2. 在滾動時,超出視口的單元格會重新使用&重新佈局。
  3. 顯式更改框架/重新加載集合。

解決方法本就可以了,保持BOOL屬性將重新加載數據源,只有當進行YES,否則將保持NO。因此,只有在重新加載收集時,滾動條纔會顯示。

在源代碼方面,

MyCollection.h

#import <UIKit/UIKit.h> 

@interface MyCollection : UICollectionView 

@property (nonatomic,assign) BOOL reloadFlag; 

@end 

MyCollection.m

#import "MyCollection.h" 

@implementation MyCollection 

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    if(_reloadFlag) { 
     [self flashScrollIndicators]; 
     _reloadFlag=NO; 
    } 
} 

用法應該是

self.collection.reloadFlag = YES; 
self.collection.dataSource = self; 
+0

好主意,它運作良好! –

3

把你的電話打到flashScrollIndicators裏面UICollectionViewLayout的方法-finalizeCollectionViewUpdates

從蘋果公司的文檔:

」 ......這個方法用於執行所有的插入,刪除和移動動畫,這樣你就可以根據需要創建使用此方法的其他動畫動畫塊中調用。否則。 ,您可以使用它執行與管理佈局對象的狀態信息相關的任何最後時刻的任務。「

希望這會有所幫助!

編輯:

好吧,我明白了。既然你提到finalizeCollectionViewUpdates方法沒有被調用,我決定自己嘗試。你說得對。問題是(對不起,我沒有注意到這一點),只有在更新集合視圖(例如插入,刪除,移動單元格)後纔會調用該方法。所以在這種情況下,它不適合你。所以,我有一個新的解決方案;它涉及到使用S方法collectionView:cellForItemAtIndexPath:

UICollectionViewDataSource在s方法indexPathsForVisibleItemsUICollectionView每一次你的手一個新的UICollectionViewCell到您的收藏查看,檢查它是否是最後一個可見單元的使用[[self.collectionView indexPathsForVisibleItems] lastObject]。您還需要BOOL伊娃來決定是否應該閃爍指示燈。每次更改dataSource時,都將該標誌設置爲YES

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor whiteColor]; 

    NSIndexPath *iP = [[self.collectionView indexPathsForVisibleItems] lastObject]; 
    if (iP.section == indexPath.section && iP.row == indexPath.row && self.flashScrollIndicators) { 
     self.flashScrollIndicators = NO; 
     [self.collectionView flashScrollIndicators]; 
    } 

    return cell; 
} 

我試過這種方法,它對我很有用。

希望它能幫助!

+0

偉大的發現,但該方法似乎並沒有改變dataSource時被調用。 –

+0

只需更改'dataSource'屬性不會導致UICollectionView重新加載數據。爲了得到這個方法,在更改數據源後嘗試調用'reloadData'方法: 'collectionView.dataSource = dataSource2;' '[collectionView reloadData];' – LuisCien

+0

看起來像我調用' reloadData'。 –