Swift 添加 UICollectionView 代替导航栏标题
Swift adding a UICollectionView in place of the navigation bar title
我正在尝试将 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
}
}
我能够使用这个显示集合视图:
self.navigationController?.navigationBar.topItem?.titleView = collectionview
...而不是创建导航项的最后四行代码。
我注意到因为 layout.itemSize
设置为占据整个导航栏,即使我在 numberOfItemsInSection
中指定了一个更大的数字,cellForItemAt
方法也只被调用了一次。
通过将 layout.itemSize
更改为较小的值,cellForItemAt
被调用了不止一次。
我正在尝试将 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
}
}
我能够使用这个显示集合视图:
self.navigationController?.navigationBar.topItem?.titleView = collectionview
...而不是创建导航项的最后四行代码。
我注意到因为 layout.itemSize
设置为占据整个导航栏,即使我在 numberOfItemsInSection
中指定了一个更大的数字,cellForItemAt
方法也只被调用了一次。
通过将 layout.itemSize
更改为较小的值,cellForItemAt
被调用了不止一次。