如何以编程方式添加UICollectionViewLayout?

时间:2017-07-12 23:50:11

标签: swift uicollectionview uicollectionviewlayout pinterest

我尝试以编程方式设置UICollectionViewLayout。我也在不使用故事板的情况下使用UICollectionView,并设置了约束。

我已经关注了这个主题的Ray Wenderlich教程,并进行了一些更改以使代码适应Swift 3(正如AZCoder2做 https://github.com/AZCoder2/Pinterest)。

由于所有这些示例都使用了故事板,我还介绍了一些更改,以创建UICollectionView及其UICollectionViewLayout

collectionViewLayout = PinterestLayout()
collectionViewLayout.delegate = self
collectionView = UICollectionView.init(frame: .zero, collectionViewLayout: collectionViewLayout)

结果:我看不到任何东西。如果我使用Apple提供的UICollectionViewLayoutUICollectionViewFlowLayout)更改UICollectionViewLayout,至少我可以看到包含其内容的单元格。如果我实施一些更改并使用故事板,一切都很好,但这不是我想要实现的方式。整个视图以编程方式进行,集合视图是其中的一部分。

我错过了什么?这与我实例化 Exception in callback: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object public class vbScipt : MonoBehaviour, IVirtualButtonEventHandler { private GameObject vbButtonObject; private GameObject zombie; // Use this for initialization void Start () { vbButtonObject = GameObject.Find ("actionButton"); zombie = GameObject.Find ("zombie"); vbButtonObject.GetComponent<VirtualButtonAbstractBehaviour> ().RegisterEventHandler (this); } public void OnButtonPressed (VirtualButtonAbstractBehaviour vb){ Debug.Log ("Button Pressed"); zombie.GetComponent<Animation> ().Play (); } public void OnButtonReleased (VirtualButtonAbstractBehaviour vb){ Debug.Log ("Button Released"); zombie.GetComponent<Animation> ().Stop (); } 的方式有关吗?我是否必须注册一些东西(例如,我需要注册可重复使用的单元格)?

3 个答案:

答案 0 :(得分:3)

如何创建一个为您创建流式布局的变量

var flowLayout: UICollectionViewFlowLayout {
    let _flowLayout = UICollectionViewFlowLayout()

    // edit properties here
    _flowLayout.itemSize = CGSize(width: 98, height: 134)
    _flowLayout.sectionInset = UIEdgeInsetsMake(0, 5, 0, 5)
    _flowLayout.scrollDirection = UICollectionViewScrollDirection.horizontal
    _flowLayout.minimumInteritemSpacing = 0.0
    // edit properties here

    return _flowLayout
}

然后你可以通过调用变量来设置它。

self.collectionView.collectionViewLayout = flowLayout // after initializing it another way
// or
UICollectionView(frame: .zero, collectionViewLayout: flowLayout)

答案 1 :(得分:1)

我可以做我想做的事情。基本上,按照我在自己的问题中建议的教程,设置集合视图及其视图布局如下:

collectionViewLayout = PinterestLayout()
collectionViewLayout.delegate = self
collectionView = DynamicCollectionView.init(frame: .zero, collectionViewLayout: collectionViewLayout)

请注意,我使用的是DynamicCollectionView(而不是UICollectionView)。 Apple不提供此课程:我使用this post中提供的代码创建了自己的课程。

请记住,这种方法是在使用约束以编程方式创建视图时。 (可能还有其他使用案例)

答案 2 :(得分:0)

我认为这会起作用。

override init(collectionViewLayout layout: UICollectionViewLayout) {
    super.init(collectionViewLayout: layout)
    collectionView?.collectionViewLayout = YourCollectionViewLayout()
}