为什么不调用UICollectionView insetForSectionsAtIndex?

Dec*_*nna 5 uicollectionview swift

我正在寻找使用以下功能的方法,但不幸的是它并未被调用。

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
}
Run Code Online (Sandbox Code Playgroud)

我收到以下控制台错误,但是我的单元格小于我的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实例为,并附加到;层=; contentOffset:{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]?
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Kin*_*one 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)

}
Run Code Online (Sandbox Code Playgroud)

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

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

因此,您需要第一个可选参数来实现此功能。