referenceSizeForHeaderInSection方法错误

时间:2017-03-12 20:59:59

标签: ios swift3 uicollectionview uicollectionviewcell

我正在尝试将headerCell添加到UICollectionView并尝试调用referenceSizeForHeaderInSection方法。我已经创建了一个collectionViewCell(ProfileCell)并且它正确构建,直到我调用referenceSizeForHeaderInSection方法,然后它崩溃了......不知道为什么。在此先感谢您的帮助!

    // UICollectionViewCell class *******
    class ProfileCell: UICollectionViewCell {

        override init(frame: CGRect) {
            super.init(frame: frame)

            setupViews()
        }

        let wordLabel: UILabel = {
            let label = UILabel()
            label.text = "test test test"
            label.translatesAutoresizingMaskIntoConstraints = false
            return label
        }()

        func setupViews() {
            backgroundColor = .red
            addSubview(wordLabel)
            wordLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
            wordLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
            wordLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
            wordLabel.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
        }
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }  
    }

    // UIViewController *******
    class HomeController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, FBSDKLoginButtonDelegate {

        lazy var collectionView: UICollectionView = {
            let layout = UICollectionViewFlowLayout()
            layout.scrollDirection = .horizontal
            layout.minimumLineSpacing = 0
            let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
            cv.delegate = self
            cv.dataSource = self
            cv.isPagingEnabled = true
            return cv
        }()

        let cellId = "cellId"
        let headerId = "headerId"

        override func viewDidLoad() {
            super.viewDidLoad()

            view.addSubview(collectionView)

            // use autolayout instead
            collectionView.anchorToTop(view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor)

            collectionView.backgroundColor = .white
            collectionView.register(ProfileCell.self, forCellWithReuseIdentifier: cellId)
            collectionView.register(UICollectionViewCell.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerId)

        fileprivate func registerCells() {
            collectionView.register(ProfileCell.self, forCellWithReuseIdentifier: cellId)
        }

        // set up collectionView
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return 4
        }

        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)
            return cell
        }

        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            return CGSize(width: view.frame.width, height: 150)
        }

        func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
            let header = collectionView.dequeueReusableCell(withReuseIdentifier: headerId, for: indexPath)
            return header
        }

    // crashes when I call this method
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
            return CGSize(width: view.frame.width, height: 50)
        }
    }

0 个答案:

没有答案