2015-11-27 76 views
7

我想動態地集中一個UICollectionView的內容,但是現有的解決方案都沒有考慮到每行可能有多個單元的事實。如何垂直中心UICollectionView內容

我已經試過這個center custom title in UINavigationBar?以及這裏的兩個解決方案:UICollectionView vertically Centred,無濟於事。

我很驚訝iOS默認不提供這種方式,甚至更多的是無法獲取當前顯示的行數(這也解決了我的問題)。此外,我無法獲得內容的大小(而不僅僅是框架的大小),這也會幫助我達到預期的效果。

我有這樣的:

-------- 
|X X X X | 
|X X X X | 
|  | 
|  | 
-------- 

但我想這一點:

-------- 
|  | 
|X X X X | 
|X X X X | 
|  | 
-------- 

任何幫助將不勝感激,

非常感謝。

+1

我不明白你的問題。如何「獲取」行數是什麼意思?你告訴集合視圖的項目數量,它們的大小等... – Darko

+0

@Darko:爲了集中一組單元格,我需要能夠知道集合視圖顯示了多少行(這與根據屏幕大小,可以連續顯示多個項目的項目數量)。一旦我有了單元格的數量,我可以將頂部插入設置爲(collectionview框架高度 - 單元格佔用的總高度)/ 2。我已經爲我的問題添加了一個可視化表示。 –

+0

關於你的視覺表現 - 如果你想要第2版,爲什麼你要讓收藏視圖如此之大?只需將其縮小並使用自動佈局將其居中在屏幕中即可。除此之外(如jorf已經回答)您可以設置節插頁。但在我看來,插入僅在運行時需要更改時纔有用。如果佈局是固定的,那麼只需要縮小收集視圖。 – Darko

回答

3

現在我明白你的問題了。根據屏幕尺寸的不同,您需要另一個插圖才能使其看起來居中。然後你必須手動計算它,但它不應該那麼難。您知道可用空間,項目數量和單元大小。只需從頂部計算插入部分。

0

UICollectionView有一個返回數組的visibleCells屬性。您可以使用NSArray上的count屬性來獲取可見單元的數量。

您應該能夠在您的委託實施中實施 - collectionView:layout:insetForSectionAtIndex:以將頂部插入設置爲將導致您正在拍攝的中心。

您也可以繼承UICollectionViewFlowLayout並根據需要實現您自己的佈局邏輯。

+0

看到我對Darko的第二個評論,爲什麼這不是一個可行的解決方案。這假定我無論屏幕大小如何都具有相同數量的單元格。儘管所有單元格都是可見的,但它們不會顯示在一組常數行上。 –

10

不確定爲什麼你不能得到內容的大小 - UICollectionViewUIScrollView的子類,因此有權訪問contentSize屬性。如果你只需要到中心的細胞的情況下,他們都無需滾動可見,你可以簡單地做到以下幾點:

collectionView.contentInset.top = max((collectionView.frame.height - collectionView.contentSize.height)/2, 0) 

這也將在情況下工作時,細胞數量的增長使得不是所有的人都在屏幕上可見並開始使用垂直滾動 - 頂部插入將設置爲0

0

如果你有一個的TabBar做到這一點

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 

    let navBarHeight  = self.navigationController?.navigationBar.frame.height 
    let collectionViewHeight = (self.collectionView?.frame.height)! - navBarHeight! 
    let itemsHeight  = self.collectionView?.contentSize.height 

    let topInset = (collectionViewHeight - itemsHeight!)/4 

    return UIEdgeInsetsMake(topInset ,0, 0 , 0) 
} 

如果不能忽視的TabBar減法,剩下的...