为"粘贴"到给定页面屏幕边界底部的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
有两个非常方便的属性,可以极大地简化此任务。参见sectionHeadersPinToVisibleBounds
和sectionFootersPinToVisibleBounds
。
好的。。所以我尝试从下面的链接更新代码。它是有效的。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。
你可以很容易地做到这一点,并添加你自己的粘性视图。