2016-07-15 75 views
7

我有一個分頁的水平滾動UICollectionView,其中每個單元格佔用視圖/設備屏幕的大小,並且一次顯示一個單元格。我遇到了一個問題,在設備旋轉時,單元格將轉換爲正確的新大小,但單元格的位置將關閉。在旋轉時調整UICollectionViewCells的大小會更改當前可見單元格

循環之前:

After Rotation

在旋轉,我不僅是如何可以調整集合視圖細胞正常,但確保當前單元格仍然顯示:

Before Rotation

旋轉後?

我把這個問題歸結爲一個沒有自定義流佈局的非常簡單的例子。

設置細胞對collectionView幀的大小的大小(集合視圖是視圖控制器的保持它的大小):

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    return collectionView.frame.size 
} 

試圖在viewWillLayoutSubviews處理旋轉:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    guard let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return } 

    flowLayout.itemSize = collectionView.frame.size 

    flowLayout.invalidateLayout() 
} 

實際上,如果我在viewWillLayoutSubviews中調用invalidateLayout(),則不需要在這裏設置itemSize,因爲在重新創建佈局時將調用sizeForItemAtIndexPath

我也試着旋轉過程中手動滾動到第一個可見單元格設置新itemSize後,卻顯示沒有改善:你UICollectionView

if let item = collectionView.indexPathsForVisibleItems().first { 
    collectionView.scrollToItemAtIndexPath(item, atScrollPosition: .CenteredHorizontally, animated: true) 
} 

回答

7

您應該處理內容偏移,所以在您的視圖控制器嘗試從UIContentContainer協議覆蓋viewWillTransitionToSize函數,如下所示:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 

    let offset = yourCollectionView?.contentOffset; 
    let width = yourCollectionView?.bounds.size.width; 

    let index  = round(offset!.x/width!); 
    let newOffset = CGPointMake(index * size.width, offset!.y); 

    yourCollectionView?.setContentOffset(newOffset, animated: false) 

    coordinator.animateAlongsideTransition({ (context) in 
     yourCollectionView?.reloadData() 
     yourCollectionView?.setContentOffset(newOffset, animated: false) 
    }, completion: nil) 
} 
相關問題