为UICollectionView
提供页脚的最佳方法是什么?“粘贴”在给定页面上的屏幕底部?假设UICollectionView
是全屏的,只有一个部分。
目前我在UICollectionReusableView
中提供了一个collectionView:viewForSupplementaryElementOfKind:atIndexPath:
对象,但是(正如人们所料)当我的收藏内容超出此屏幕界限时,页脚会被推离屏幕。
我猜的关键是装饰视图 - 但是我找不到任何关于这些工作方式的好代码(非IB)示例,而Apple的文档在我看来不清楚这个特别的主题。
更新:装修视图
在构建并尝试装饰视图(using this tutorial)之后,我遇到了一些限制 - 即装饰视图>之间没有任何回调 object和您的UICollectionViewController
控制器对象(装饰视图由UICollectionViewLayout
对象管理,而不是UICollectionViewController
对象。似乎Apple非常认真地将装饰视图限制在视觉装饰中,而不是数据驱动(尽管你显然可以解决这个问题)。
所以,“正确”的解决方案仍然无法解决,但与此同时,我只是创建了一个静态UIView
对象,而我只是从UICollectionViewController
对象管理它。它运作正常,但感觉不对。
更新re:Sticky HEADERS
在过去的几个月里,我在各种项目中处理过类似的问题,并且最近找到了粘性HEADERS的解决方案。我认为这同样适用于页脚,但我还没有测试过它。
此处有关标题的详细信息:
实施非常繁重,但在大多数情况下它似乎运作良好。
如果很快就此问题没有进一步的活动,我将以副本的形式结束并指向上述文章。
答案 0 :(得分:16)
基本上你需要做的是提供一个自定义的UICollectionViewLayout
子类,当边界发生变化时(当视图滚动边界变化时)使自身无效。然后为补充视图提供UICollectionViewLayoutAttributes
,其中更新中心以拥抱集合视图的当前边界(顶部,底部,左侧,右侧,等等)。
我在github上添加了展示此策略的项目。
更新:从iOS 9开始,UICollectionViewFlowLayout
有两个非常方便的属性,可以大大简化此任务。请参阅sectionHeadersPinToVisibleBounds
和sectionFootersPinToVisibleBounds
。
答案 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。
您可以轻松地执行此操作并自行添加粘性视图。