为什么UICollectionView的insetForSectionsAtIndex方法没有被调用?

7
我想使用以下函数,但不幸的是它没有被调用。
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
}

我遇到了以下控制台错误,但是我的单元格比我的集合视图小,并且我已将部分插图和布局边距设置为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实例为,它附加在;层=;contentOffset:{0,0};contentSize:{0,68.5}> collection view layout:。 2017-03-30 11:25:14.625 Prep[92400:1862856] 在调试器中设置一个符号断点UICollectionViewFlowLayoutBreakForInvalidSizes来捕获此问题。 单元格高度 --> 42.0

enter image description here

协议

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]?

enter image description here


尝试给集合视图一个固定的高度并测试是否有效。也许是高度约束造成了问题。 - Kingalione
@Kingalione 这样做可以解决掉控制台错误(我正在使用一个比例高度约束),但是函数仍然没有被调用。 - Declan McKenna
你实现了正确的委托吗? - Kingalione
@Kingalione 我已经更新了问题所使用的协议。我使用了 UICollectionViewDelegateUICollectionViewDataSourceUICollectionViewDelegateFlowLayout。这些中的最后一个我在类的顶部声明了,没有做更多的操作。 - Declan McKenna
@Kingalione 是的,这些函数也可以正常工作。只是似乎没有调用 insetForSectionsAtIndex 函数。 - Declan McKenna
显示剩余2条评论
1个回答

2

好的,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 属性不存在。 - Declan McKenna
现在我看到了你的问题。你必须正确地转换collectionViewLayout。我已经更新了我的答案。这应该可以工作! - Kingalione
我怀疑它会有问题,我的电脑出了技术故障,所以无法尝试。我再次运行时会更新,谢谢。 - Declan McKenna
Xcode 抛出错误,提示删除关键字“optional”!? - Famic Tech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接