2014-11-15 110 views
1

我正在創建一個分頁的UICollectionView,它水平滾動,其單元格與集合視圖一樣大,因此一次只顯示一個單元格。我還希望在集合視圖第一次出現時首先顯示最後一個項目,以便其他項目從左側顯示,而不是默認的下一個項目從右側進入。scrollToItemAtIndexPath破壞UICollectionViewCell佈局

爲此,我在視圖控制器的viewDidLayoutSubviews中調用scrollToItemAtIndexPath:,如this answer所示。如果我將電話scrollToItemAtIndexPath放在viewWillAppear或viewDidLoad中,收集視圖根本不會滾動到最後一項。

但是,這個調用破壞了我的collection視圖單元格的佈局。例如,如果我不打電話給scrollToItemAtIndexPath:,則收集視圖(下面的白色區域)看起來像左側 - 正確佈局但顯示第一個項目。如果我打電話給scrollToItemAtIndexPath:,收集視圖最初會顯示最後一個項目,但佈局會像右側一樣混亂(日期甚至不再顯示)。

enter image description here

我在做什麼錯?

更多信息:

  • 我看到這個錯誤無論是在iOS的7和iOS 8
  • 我使用的大小類在Xcode 6.1。

爲viewDidLayoutSubviews代碼:

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:self.unit.readings.count - 1 inSection:0]; 
    [self.readingCollectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO]; 
} 

回答

1

我把viewWillLayoutSubviews以下(也適用於viewDidLayoutSubviews):

[self.readingCollectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO]; 
[self.readingCollectionView reloadData]; 

一個UI問題仍然存在,但是:視圖控制器出現時,它顯示的第一個項目,然後立即刷新到顯示最後一個項目。

爲了解決這個看似無法解決的問題,我改爲使用UI:在視圖控制器出現之前顯示「加載」標籤,並在viewDidAppear中顯示集合視圖。

2

每當我有這個問題,我有一個固定大小的細胞,我剛通過手動設置contentOffset和忽略的CollectionView方法圍繞它的工作。

self.collectionView.contentOffset = (CGPoint){ 
    .x = self.collectionView.contentSize.width - cell.width, 
    .y = 0, 
}; 
+0

此方法有效。我只需將這個調用放在'viewWillLayoutSubviews'或'viewDidLayoutSubviews'中,因爲'viewWillAppear'和'viewDidLoad'中的contentSize.width'仍然是零。 –