我有一个带有以下声明和构造函数的类:
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
}
由于某种原因,永远不会调用该函数。否则,程序运行正常。或者是否有更好的方法可以在每一轮中心细胞?
提前致谢。
答案 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的答案将起作用。您需要了解的是UICollectionViewDelegateFlowLayout
是UICollectionViewDelegate
的子代,所以我不完全知道既然您同时符合这两个条件将会发生什么。
@Eyzuky之所以可行的原因是,Objective-C没有像Swift这样的严格的一致性协议,但是,如果您在一致性类中实现了该函数,Objective-C将会查看委托对象是否正在响应该选择器,并且由于委托对象是对您的类的弱引用,并且您的类当前已实现了该功能,因此可以。
Objective-C的新手通常认为他们必须在接口声明中带有<UICollectionViewDelegate>
才能正常工作,这是一个基本错误,但这并没有真正的作用。
但是,当快速执行此操作时,不再调用responseToSelector方法,因此您可以告诉您的collectionView委托没关系,并且可以通过添加@objc符号和协议的确切地址来使用我的函数方法。
此外,考虑到现在可能存在两个不同的对象,因此同时遵守UICollectionViewDelegateFlowLayout
和UICollectionViewDelegate
可能会引起问题。我无法在自己的代码中取消引用相同的情况,但这可能是导致您出现问题的原因。我建议您在将collectionView委托对象设置为self的同时,从类实现中删除UICollectionViewDelegate
。因此引用不会混淆。
所以您的课程看起来像这样:
class GameView: UIView, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout
,在您的collectionView
实现中,您将:
collectionView!.dataSource = self
collectionView!.delegate = self