UICollectionView 未显示以查看
UICollectionView not displayed to view
我已经被这个问题困了将近一个星期了。我什至恢复了我的代码并编写了与某些教程相同的代码,但我似乎无法让我的 UICollectionView
终生显示在视图中。我的视图控制器中还有很多其他代码,所以我将显示属于 UICollectionView
的代码。这是我目前所拥有的:
视图控制器:
class UARTModuleViewController: UIViewController, CBPeripheralManagerDelegate, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
override func viewDidLoad() {
super.viewDidLoad()
setupMenuBar()
}
let menuBar: MenuBar = {
let mb = MenuBar()
return mb
}()
private func setupMenuBar() {
view.addSubview(menuBar)
let horizontalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":menuBar])
let verticalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0(100)]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":menuBar])
view.addConstraints(horizontalConstraint)
view.addConstraints(verticalConstraint)
}
}
MenuBar.swift:
class MenuBar : UIView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
lazy var collectionView : UICollectionView = {
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
cv.backgroundColor = UIColor.red
cv.dataSource = self
cv.delegate = self
return cv
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(collectionView)
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MenuCell")
//took out constraints here just to make the warning mentioned below easier to follow.
}
我确实实现了我的协议,但我没有添加它们只是为了节省我发布的代码量。我确实在 UARTModuleViewController
加载后收到此警告:
[LayoutConstraints] Unable to simultaneously satisfy constraints.
我试过推理,但似乎无法得出解决方案。我也有一个单元格 class,但认为没有必要包括在内,因为我无法显示 UICollectionView
。我唯一可以添加的另一件事是我在故事板中添加的视图中间有一个 UIImageView
并像这样施加约束:
有人对我做错了什么有什么建议吗?提前感谢您提供的任何帮助或建议。
根据评论:
- 首先,每次在代码中使用约束时,必须将
translatesAutoresizingMaskIntoConstraints = false
设置为要添加约束的视图。
- 您没有告诉集合视图填充整个
MenuBar
space。
- 在
setupMenuBar
中应用于 MenuBar
的约束不足以确定视图的大小和位置。
您应该应用这些更改来告诉 MenuBar
填充宽度、高度为 60 磅并定位在屏幕底部:
private func setupMenuBar() {
view.addSubview(menuBar)
menuBar.translatesAutoresizingMaskIntoConstraints = false // this will make your constraint working
menuBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true // every constraint must be enabled.
menuBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
menuBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
menuBar.heightAnchor.constraint(equalToConstant: 60).isActive = true
}
要告诉集合视图填充整个 MenuBar
视图,请在 MenuBar
init(frame:)
方法中执行此操作:
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(collectionView)
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MenuCell")
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.topAnchor.constraint(equalTo: topAnchor).isActive = true
collectionView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
collectionView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
collectionView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
//took out constraints here just to make the warning mentioned below easier to follow.
}
正如您在我的代码中看到的,我通常使用 "anchor" 方法来应用约束,因为它们比视觉格式更容易。
我已经被这个问题困了将近一个星期了。我什至恢复了我的代码并编写了与某些教程相同的代码,但我似乎无法让我的 UICollectionView
终生显示在视图中。我的视图控制器中还有很多其他代码,所以我将显示属于 UICollectionView
的代码。这是我目前所拥有的:
视图控制器:
class UARTModuleViewController: UIViewController, CBPeripheralManagerDelegate, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
override func viewDidLoad() {
super.viewDidLoad()
setupMenuBar()
}
let menuBar: MenuBar = {
let mb = MenuBar()
return mb
}()
private func setupMenuBar() {
view.addSubview(menuBar)
let horizontalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":menuBar])
let verticalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0(100)]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":menuBar])
view.addConstraints(horizontalConstraint)
view.addConstraints(verticalConstraint)
}
}
MenuBar.swift:
class MenuBar : UIView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
lazy var collectionView : UICollectionView = {
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
cv.backgroundColor = UIColor.red
cv.dataSource = self
cv.delegate = self
return cv
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(collectionView)
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MenuCell")
//took out constraints here just to make the warning mentioned below easier to follow.
}
我确实实现了我的协议,但我没有添加它们只是为了节省我发布的代码量。我确实在 UARTModuleViewController
加载后收到此警告:
[LayoutConstraints] Unable to simultaneously satisfy constraints.
我试过推理,但似乎无法得出解决方案。我也有一个单元格 class,但认为没有必要包括在内,因为我无法显示 UICollectionView
。我唯一可以添加的另一件事是我在故事板中添加的视图中间有一个 UIImageView
并像这样施加约束:
有人对我做错了什么有什么建议吗?提前感谢您提供的任何帮助或建议。
根据评论:
- 首先,每次在代码中使用约束时,必须将
translatesAutoresizingMaskIntoConstraints = false
设置为要添加约束的视图。 - 您没有告诉集合视图填充整个
MenuBar
space。 - 在
setupMenuBar
中应用于MenuBar
的约束不足以确定视图的大小和位置。
您应该应用这些更改来告诉 MenuBar
填充宽度、高度为 60 磅并定位在屏幕底部:
private func setupMenuBar() {
view.addSubview(menuBar)
menuBar.translatesAutoresizingMaskIntoConstraints = false // this will make your constraint working
menuBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true // every constraint must be enabled.
menuBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
menuBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
menuBar.heightAnchor.constraint(equalToConstant: 60).isActive = true
}
要告诉集合视图填充整个 MenuBar
视图,请在 MenuBar
init(frame:)
方法中执行此操作:
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(collectionView)
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MenuCell")
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.topAnchor.constraint(equalTo: topAnchor).isActive = true
collectionView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
collectionView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
collectionView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
//took out constraints here just to make the warning mentioned below easier to follow.
}
正如您在我的代码中看到的,我通常使用 "anchor" 方法来应用约束,因为它们比视觉格式更容易。