如何为 UICollectionView 创建"粘性"页脚?



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

目前,我在collectionView:viewForSupplementaryElementOfKind:atIndexPath:中提供了一个UICollectionReusableView对象,但(正如人们所期望的那样(当我的集合的内容超过这个屏幕的界限时,页脚就会被推离屏幕。

我猜关键是装饰视图,但我找不到任何关于这些工作原理的好代码(非IB(示例,我认为苹果的文档不清楚这个特定主题。

更新re:装饰视图

在构建并试用Decoration View(使用本教程(后,我遇到了一些限制,即Decoration View对象和UICollectionViewController控制器对象之间实际上没有任何回调(装饰视图UICollectionViewLayout对象管理,而不是由UICollectionViewController对象管理(。苹果似乎非常重视装饰视图仅限于视觉装饰,而不是数据驱动(尽管你显然可以绕过这一点(。

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

更新re:粘性头

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

关于标题的详细信息:

如何使补充视图在UICollectionView中浮动,就像在UITableView纯样式中的节标题一样

实现相当繁重,但它似乎在大多数情况下都能很好地工作。

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

基本上,您需要做的是提供一个自定义UICollectionViewLayout子类,该子类在边界更改时(当视图滚动边界更改时(使自己无效。然后为补充视图提供UICollectionViewLayoutAttributes,其中中心被更新为包含集合视图的当前边界(顶部、底部、左侧、右侧等(。

我在github上添加了一个项目,展示了这一策略。

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

好的。。所以我尝试从下面的链接更新代码。它是有效的。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)
}}

UICollectionViewController(类似于UITableVC(是一个"快捷方式",这两个类只是覆盖UIViewController,为您创建collectionView。

你可以很容易地做到这一点,并添加你自己的粘性视图。

相关内容

  • 没有找到相关文章

最新更新