【问题标题】:UICollectionView: Is there a way to reload only the supplementary views?UICollectionView:有没有办法只重新加载补充视图?
【发布时间】:2015-01-15 21:41:29
【问题描述】:

每个部分都有一个带有 supplementaryView 的 uicollectionview。 在每个 supplementaryView 我都有一些按钮。 在 dataSource 方法 collectionView:viewForSupplementaryElementOfKind:atIndexPath: 我使用 indexPath.section 设置按钮标签。当按下按钮时我做了一些委托方法并将部分(button.tag)作为参数发送。

一切正常,但问题来了:

  • 当我插入或删除一个部分时,它必须更新按钮标签,但我不想重新加载每个部分的所有项目。

我试过了:

  • 使用 dataSource 方法 collectionView:viewForSupplementaryElementOfKind:atIndexPath: 获取补充视图并为每个 supplementaryView 调用 layoutIfNeeded 方法,这样supplementaryViews 正在重新加载,但这种方法会增加我的 supplementaryViews
  • collectionView.subviews 中的快速 for 并仅获取 supplementaryView 并调用 layoutIfNeeded 方法,但它不会重新加载,只是布局正在重新加载。
  • reloadSections: 方法,但这会重新加载部分中的所有项目

哦.. 我使用 NSFetchedResultsController(delegate) 来插入和删除部分。

谁能帮我解决这个问题?有没有办法只重新加载 supplementaryView?这种情况还有其他方法吗?

谢谢!

【问题讨论】:

  • 我解决了。我为我的 supplementaryView 使用自定义 UICollectionViewLayoutAttributes ,其中一个自定义属性是 NSInteger ,它保留该部分和 NSFetchedResultsController 委托方法 controllerDidChangeContent: 在插入或删除部分后,我使集合视图布局无效。我不确定是否是最佳做法,但它有效,现在时间很重要:)

标签: ios objective-c uicollectionview


【解决方案1】:

要重新加载补充视图,您可以使用-invalidateLayoutWithContext:

请参阅UICollectionViewLayoutInvalidationContext 和方法-invalidateSupplementaryElementsOfKind:atIndexPaths: 的文档(iOS 8 起可用)。

【讨论】:

  • invalidateSupplementaryElementsOfKind 适用于 iOS 8 及更高版本。
  • 这是一个老问题,但很高兴知道未来的类似情况。谢谢!
  • 知道如何让补充视图重新加载以使用 invalidLayout 进行动画处理吗?
  • 这实际上似乎并没有触发collectionView(_:viewForSupplementaryElementOfKind:) API
【解决方案2】:

而不是重新加载这些视图,获取对每个可见补充视图的引用以便您可以更改标签可能足以满足您的需求。

您可以使用一个简单的方法来做到这一点:

let supplementaryViews = collectionView.visibleSupplementaryViews(ofKind: "identifier")

https://developer.apple.com/documentation/uikit/uicollectionview/1618026-visiblesupplementaryviews

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多