Swift 添加 UICollectionView 代替导航栏标题

Posted

技术标签:

【中文标题】Swift 添加 UICollectionView 代替导航栏标题【英文标题】:Swift adding a UICollectionView in place of the navigation bar title 【发布时间】:2018-05-08 01:45:48 【问题描述】:

我正在尝试将 UICollectionView 添加到导航栏以代替导航标题,就像在 ios 中的本机消息应用程序中所做的那样。据我所知,这是:

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
    

【问题讨论】:

您想将标题替换为“就像在 iOS 的原生消息应用中所做的那样”?请张贴这意味着什么的屏幕截图。 【参考方案1】:

我能够使用这个来显示集合视图:

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

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

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

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

【讨论】:

谢谢迈克。对于带有 xib 文件的自定义集合单元,我不得不稍微修改代码。我已经更新了我的问题以包含该代码以防其他人需要它。

以上是关于Swift 添加 UICollectionView 代替导航栏标题的主要内容,如果未能解决你的问题,请参考以下文章

Swift:Tumblr 是不是在 UIScrollView 中添加了 UICollectionView?

如何在 UICollectionView、Swift 5、Xcode 的行下添加行

在 Swift 中以编程方式在 UITableViewCell 中创建一个 UICollectionView

UICollectionview 将数据追加到数组 Swift

UITableViewCell 中的 UICollectionView 在 swift 3 中滚动不流畅

Swift 中的 UiSearchController 到 UiCollectionView