2017-08-10 49 views
0

我使用兩個補充視圖(即,UICollectionReusableView s)來渲染頁腳和頁眉夾着UICollectionView。UICollectionViewController:使粘頁腳,無論CollectionView的大小如何

問題是,當UICollectionView短(例如,只有一個單元格被佔用)時,頁腳視圖向上滑動,並且不會「粘」到底部!

其他文章解決了這種行爲;在某些情況下,作者使用自定義佈局來實現粘性頁腳/頁眉。相反,我只是將sectionFootersPinToVisibleBoundssectionHeadersPinToVisibleBounds設置爲true,這通常工作正常 - 直到UICollectionView短。

這發生在Swift 3.0(iOS 10.3),iPhone 6.x模擬器中。

將頁腳視圖固定到UICollectionViewController的底部的建議方法是什麼?

回答

0

如果你沒有堅持使用UICollectionViewController,我通常使用普通的'ol UIViewController並在其中粘貼一個UICollectionView,從而擴展UICollectionViewDataSource和UICollectionViewDelegate協議。

我想如果你需要UICollectionViewController,你可以做同樣的事情,但嵌入視圖控制器本身。

使用UIViewController可以輕鬆地將視圖粘貼到需要約束的位置。

+0

我們最終可能會按照你的建議。我之所以選擇帶有UICollectionViewController的「內置」頁腳/標題是因爲它是開箱即用的,該控制器對我們的問題很好。我認爲一個通用的UIViewController可能會正常工作,但可能需要更多的腳步工作... –

0

好..所以我已經嘗試從下面的鏈接更新代碼。它的工作原理。

https://teamtreehouse.com/community/add-sticky-footer-to-uicollectionview-in-swift

class StickyFooter : UICollectionViewFlowLayout { 


var footerIsFound    : Bool = false 
var UICollectionAttributes : [UICollectionViewLayoutAttributes]? 


override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { 
    return true 
} 


override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? 
{ 
    UICollectionAttributes = super.layoutAttributesForElements(in: rect) 

    for attributes in UICollectionAttributes! { 

     if let type = attributes.representedElementKind { 

      if type == UICollectionElementKindSectionFooter 
      { 
       footerIsFound = true 
       updateFooter(attributes: attributes) 
      } 
     } 
    } 

    if (!self.footerIsFound) { 

     let newItem = self.layoutAttributesForSupplementaryView(ofKind: UICollectionElementKindSectionFooter, at : NSIndexPath(row: self.UICollectionAttributes!.count, section: 0) as IndexPath) 


     UICollectionAttributes?.append(newItem!) 

    } 

    return UICollectionAttributes 
} 

override func layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? 
{ 
    let attributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: elementKind, with: indexPath) 

    attributes.size = CGSize(width: self.collectionView!.bounds.size.width, height: 75) //your footer size 

    if elementKind.isEqualToString(find: UICollectionElementKindSectionFooter) 
    { 
     updateFooter(attributes: attributes) 
    } 
    return attributes 
} 

func updateFooter(attributes : UICollectionViewLayoutAttributes){ 
    let currentBounds = self.collectionView?.bounds 
    attributes.zIndex = 1024 
    attributes.isHidden = false 
    let yOffset = currentBounds!.origin.y + currentBounds!.size.height - attributes.size.height/2.0 
    attributes.center = CGPoint(x: currentBounds!.midX, y: yOffset) 

}} 
+0

將class StickyFooter分配給您的collectionviewflow佈局 –