8

UICollectionView为“粘”到给定页面的屏幕边界底部的页脚提供页脚的最佳方法是什么?假设UICollectionView是全屏并且只有一个部分。

目前我在 中提供一个UICollectionReusableView对象collectionView:viewForSupplementaryElementOfKind:atIndexPath:,但是(正如人们所期望的那样)当我的集合的内容超出此屏幕的范围时,页脚被推到屏幕外。

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

更新回复:装饰视图

在构建并尝试了装饰视图使用本教程)之后,我遇到了一些限制 - 即装饰视图对象和您的UICollectionViewController控制器对象之间实际上没有任何回调(装饰视图由一个UICollectionViewLayout对象管理,而不是UICollectionViewController目的)。看起来 Apple 非常重视装饰视图仅限于视觉装饰,而不是数据驱动(尽管你显然可以绕过这个)。

因此,我仍然无法找到“正确”的解决方案,但与此同时,我刚刚创建了一个静态UIView对象,并且只是从我的UICollectionViewController对象中管理它。它工作正常,但感觉不对。

更新回复:粘性标题

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

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

如何使补充视图在 UICollectionView 中浮动,就像部分标题在 UITableView 普通样式中一样

实现相当繁重,但在大多数情况下似乎运行良好。

如果很快没有关于这个问题的进一步活动,我将作为副本关闭并指向上面的文章。

4

3 回答 3

16

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

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

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

于 2013-06-04T16:42:13.237 回答
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)

}}
于 2018-02-06T06:58:41.077 回答
-6

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

您可以轻松地做到这一点并自行添加粘性视图。

于 2013-04-17T14:29:06.430 回答