如何为UICollectionView创建“粘性”页脚?

时间:2013-01-18 23:58:23

标签: ios ios6 uicollectionview uicollectionreusableview

UICollectionView提供页脚的最佳方法是什么?“粘贴”在给定页面上的屏幕底部?假设UICollectionView是全屏的,只有一个部分。

目前我在UICollectionReusableView中提供了一个collectionView:viewForSupplementaryElementOfKind:atIndexPath:对象,但是(正如人们所料)当我的收藏内容超出此屏幕界限时,页脚会被推离屏幕。

我猜的关键是装饰视图 - 但是我找不到任何关于这些工作方式的好代码(非IB)示例,而Apple的文档在我看来不清楚这个特别的主题。

更新:装修视图

在构建并尝试装饰视图using this tutorial)之后,我遇到了一些限制 - 即装饰视图之间没有任何回调 object和您的UICollectionViewController控制器对象(装饰视图UICollectionViewLayout对象管理,而不是UICollectionViewController对象。似乎Apple非常认真地将装饰视图限制在视觉装饰中,而不是数据驱动(尽管你显然可以解决这个问题)。

所以,“正确”的解决方案仍然无法解决,但与此同时,我只是创建了一个静态UIView对象,而我只是从UICollectionViewController对象管理它。它运作正常,但感觉不对。

更新re:Sticky HEADERS

在过去的几个月里,我在各种项目中处理过类似的问题,并且最近找到了粘性HEADERS的解决方案。我认为这同样适用于页脚,但我还没有测试过它。

此处有关标题的详细信息:

How to make Supplementary View float in UICollectionView as Section Headers do in UITableView plain style

实施非常繁重,但在大多数情况下它似乎运作良好。

如果很快就此问题没有进一步的活动,我将以副本的形式结束并指向上述文章。

3 个答案:

答案 0 :(得分:16)

基本上你需要做的是提供一个自定义的UICollectionViewLayout子类,当边界发生变化时(当视图滚动边界变化时)使自身无效。然后为补充视图提供UICollectionViewLayoutAttributes,其中更新中心以拥抱集合视图的当前边界(顶部,底部,左侧,右侧,等等)。

我在github上添加了展示此策略的项目。

更新:从iOS 9开始,UICollectionViewFlowLayout有两个非常方便的属性,可以大大简化此任务。请参阅sectionHeadersPinToVisibleBoundssectionFootersPinToVisibleBounds

答案 1 :(得分: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)

    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)

}}

答案 2 :(得分:-4)

UICollectionViewController(比如UITableVC)是一个“快捷方式”,这两个类只是重写UIViewController,为你创建collectionView。

您可以轻松地执行此操作并自行添加粘性视图。