未调用UICollectionView insetForSectionAtIndex

时间:2016-12-08 06:46:54

标签: swift uicollectionview uicollectionviewlayout

我有一个带有以下声明和构造函数的类:

class GameView: UIView, UICollectionViewDelegate,  UICollectionViewDataSource, UICollectionViewDelegateFlowLayout
{
    var collectionView: UICollectionView?
    var flowLayout =  UICollectionViewFlowLayout()

    init (frame : CGRect, navigationController:UINavigationController, parentViewController: ScrambleViewController)
{
    super.init(frame : frame)
    cvFrame = CGRect(x: cvLeftBorder, y: cvY, width: Int(UIScreen.main.bounds.width) -  (2 * cvLeftBorder), height: cvHeight)
    collectionView = UICollectionView(frame: cvFrame!, collectionViewLayout: flowLayout);
    collectionView!.dataSource = self
    collectionView!.delegate = self;
    .....
}

这是一个每轮都有不同数量的细胞的游戏。我想把细胞居中,所以我插入了:

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

 // calculate the insets and return a UIEdgeInsets
}

由于某种原因,永远不会调用该函数。否则,程序运行正常。或者是否有更好的方法可以在每一轮中心细胞?

提前致谢。

5 个答案:

答案 0 :(得分:10)

这将有效:

@objc(collectionView:layout:insetForSectionAtIndex:)  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets{
    return UIEdgeInsetsMake(5, 5, 5, 5)
}

答案 1 :(得分:1)

别忘了添加UICollectionViewDelegateFlowLayout

答案 2 :(得分:0)

签名在Swift 3中发生了变化:

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

答案 3 :(得分:0)

sobremesa答案是正确的,因此要实现此方法,您必须使用以下内容:

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

答案 4 :(得分:0)

@Eyzuky的答案将起作用。您需要了解的是UICollectionViewDelegateFlowLayoutUICollectionViewDelegate的子代,所以我不完全知道既然您同时符合这两个条件将会发生什么。

@Eyzuky之所以可行的原因是,Objective-C没有像Swift这样的严格的一致性协议,但是,如果您在一致性类中实现了该函数,Objective-C将会查看委托对象是否正在响应该选择器,并且由于委托对象是对您的类的弱引用,并且您的类当前已实现了该功能,因此可以。

Objective-C的新手通常认为他们必须在接口声明中带有<UICollectionViewDelegate>才能正常工作,这是一个基本错误,但这并没有真正的作用。

但是,当快速执行此操作时,不再调用responseToSelector方法,因此您可以告诉您的collectionView委托没关系,并且可以通过添加@objc符号和协议的确切地址来使用我的函数方法。

此外,考虑到现在可能存在两个不同的对象,因此同时遵守UICollectionViewDelegateFlowLayoutUICollectionViewDelegate可能会引起问题。我无法在自己的代码中取消引用相同的情况,但这可能是导致您出现问题的原因。我建议您在将collectionView委托对象设置为self的同时,从类实现中删除UICollectionViewDelegate。因此引用不会混淆。

所以您的课程看起来像这样: class GameView: UIView, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

,在您的collectionView实现中,您将:

collectionView!.dataSource = self collectionView!.delegate = self