Swift添加UICollectionView代替导航栏标题

时间:2018-05-08 01:45:49

标签: ios swift uinavigationbar uinavigationitem

我正在尝试将UICollectionView添加到导航栏以代替导航标题,就像在iOS中的本机Messages应用程序中所做的那样。就我而言:

let navigationBar = UINavigationBar()

    var collectionview: UICollectionView!
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    layout.itemSize = CGSize(width: navigationBar.frame.width, height: navigationBar.frame.height)

    collectionview = UICollectionView(frame: navigationBar.frame, collectionViewLayout: layout)
    collectionview.dataSource = self
    collectionview.delegate = self
    collectionview.register(UserImagesCollectionViewCell.self, forCellWithReuseIdentifier: "userCell")
    collectionview.showsVerticalScrollIndicator = false
    collectionview.backgroundColor = .red

    let navigationItem = UINavigationItem()
    navigationItem.title = ""
    navigationItem.titleView = collectionview

    navigationBar.items = [navigationItem]

此代码运行时没有任何错误,但在视图控制器上不显示任何内容。这里有一些我不知道的东西,我不能把手指放在上面。有什么帮助吗?

编辑: 在Mike的回答的帮助下,这是我在导航栏中创建一个带有自定义单元格xib文件的uicollectionview的代码。

func setupCustomCollectionView() {
    if let navigationBar = self.navigationController?.navigationBar {
        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        layout.itemSize = CGSize(width: navigationBar.frame.width / 4, height: navigationBar.frame.height)

        collectionview = UICollectionView(frame: navigationBar.frame, collectionViewLayout: layout)
        collectionview.dataSource = self
        collectionview.delegate = self
        let nibCell = UINib(nibName: "UserImagesCollectionViewCell", bundle: nil)
        collectionview.register(nibCell, forCellWithReuseIdentifier: "userCell")

        collectionview.showsVerticalScrollIndicator = false
        collectionview.backgroundColor = .red

        self.navigationController?.navigationBar.topItem?.titleView = collectionview
    }
}

1 个答案:

答案 0 :(得分:3)

我能够使用以下方式显示集合视图:

self.navigationController?.navigationBar.topItem?.titleView = collectionview

...而不是创建导航项的最后四行代码。

我注意到因为layout.itemSize设置为占用整个导航栏,cellForItemAt方法只调用一次,即使我在numberOfItemsInSection中指定了更大的数字。

通过将layout.itemSize更改为较小的值,cellForItemAt被多次调用。