【问题标题】:Why is UICollectionView insetForSectionsAtIndex not being called?为什么不调用 UICollectionView insetForSectionsAtIndex?
【发布时间】:2017-08-24 03:37:44
【问题描述】:

我希望使用以下函数,但不幸的是它没有被调用。

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewFlowLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
        let cellCount = Double(collectionView.numberOfItems(inSection: section))
        if let cell = collectionView.cellForItem(at: IndexPath(row: 0, section: section))
        {
            let cellWidth = Double(cell.frame.size.width)
            let totalCellWidth = cellWidth * cellCount
            let cellSpacing = Double(collectionViewLayout.minimumInteritemSpacing)
            let totalSpacingWidth = cellSpacing * (cellCount - 1)

            let leftInset = (collectionView.frame.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2
            let rightInset = leftInset

            return UIEdgeInsetsMake(0, leftInset, 0, rightInset)
        }

    return collectionView.layoutMargins
}

我收到以下控制台错误,但我的单元格比我的 collectionView 小,并且我已将部分插入和布局边距设置为 0。

2017-03-30 11:25:14.624 Prep[92400:1862856] UICollectionViewFlowLayout 的行为未定义,因为: 2017-03-30 11:25:14.624 Prep[92400:1862856] 项目高度必须小于 UICollectionView 的高度减去部分插入顶部和底部值,减去内容插入顶部和底部值。 2017-03-30 11:25:14.624 Prep[92400:1862856] 相关的 UICollectionViewFlowLayout 实例是 , 并附加到 ;层 = ;内容偏移:{0, 0}; contentSize: {0, 68.5}> 集合视图布局: . 2017-03-30 11:25:14.625 Prep[92400:1862856] 在 UICollectionViewFlowLayoutBreakForInvalidSizes 处创建一个符号断点以在调试器中捕获此问题。 单元格高度 --> 42.0

协议

class OverviewViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@IBOutlet weak var vipCollectionView: UICollectionView!

var hostedMeetingsArray: [String]?
var vipArray: [Attendee]?

class OverviewViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@IBOutlet weak var vipCollectionView: UICollectionView!

var hostedMeetingsArray: [String]?
var vipArray: [Attendee]?

【问题讨论】:

  • 尝试给集合视图一个恒定的高度并测试它是否工作。也许是高度限制造成了问题。
  • @Kingalione 这消除了控制台错误(我使用的是比例高度约束)但仍然没有调用该函数。
  • 你实现了正确的委托吗?
  • @Kingalione 我已经用使用的协议更新了这个问题。我使用了UICollectionViewDelegateUICollectionViewDataSourceUICollectionViewDelegateFlowLayout。我在班级顶部声明的最后一个,仅此而已。
  • 是的,它是正确的协议。那么 cellForItemAt 和 numberOfItemsInSection 是否被调用?

标签: swift uicollectionview


【解决方案1】:

好的,不调用 insetForSectionAt 的问题是你必须这样实现:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {

   //access to minimumInteritemSpacing by casting to UICollectionViewFlowLayout
   let layout = collectionViewLayout as! UICollectionViewFlowLayout
   let spacing = layout.minimumInteritemSpacing       

   return UIEdgeInsetsMake(0.5,0,0.5,0)

}

看看 UICollectionViewDelegateFlowLayout 协议。 insetForSectionAt 声明如下:

@available(iOS 6.0, *)
optional public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets

所以你需要第一个可选参数来实现这个功能。

【讨论】:

  • XCode 给了我一个指向此函数的警告,但它并没有为我完成这项工作,因为它使用 UICollectionViewLayout 而不是 UICollectionViewFlowLayout。所以collectionViewLayout.minimumInteritemSpacing 属性不存在。
  • 现在我看到了你的问题。您必须正确转换 collectionViewLayout。我已经更新了我的答案。这应该可行!
  • 我怀疑会有,我的电脑出现了技术问题,所以无法尝试。当我再次启动并运行时,我会更新,谢谢。
  • xcode 抛出错误,说要删除关键字“可选”!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多