我正在使用编程约束创建UITableViewCell.这通电话有cardView
分和button
分.仅使用cardview就可以正常工作.但一旦我将UIButton
加到那里,我就可以在控制台上看到错误.
Complete Code:个
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
private lazy var tableView: UITableView = {
let view = UITableView()
self.view.addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
view.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
view.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
view.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(Cell.self, forCellReuseIdentifier: "Cell")
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: Cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell
cell.configure()
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("selected: \(indexPath.row)")
}
}
private final class Cell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.backgroundColor = .clear
self.selectionStyle = .none
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private lazy var cardView: UIView = {
let view = UIView()
self.contentView.addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
view.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant: 18),
view.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 9),
view.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -18),
view.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -9),
view.heightAnchor.constraint(equalToConstant: 60)
])
view.layer.cornerRadius = 8
view.layer.borderColor = UIColor.lightGray.withAlphaComponent(0.7).cgColor
view.layer.borderWidth = 1.0
return view
}()
private(set) lazy var buttonOptions: UIButton = {
let button = UIButton()
self.cardView.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
button.widthAnchor.constraint(equalToConstant: 22),
button.heightAnchor.constraint(equalToConstant: 18),
button.centerXAnchor.constraint(equalTo: self.cardView.centerXAnchor),
button.centerYAnchor.constraint(equalTo: self.cardView.centerYAnchor)
])
button.backgroundColor = UIColor.lightGray.withAlphaComponent(0.6)
button.setImage(UIImage(systemName: "ellipsis")!, for: .normal)
button.imageView?.tintColor = UIColor.lightGray
return button
}()
func configure() {
self.cardView.backgroundColor = .white
self.buttonOptions.isHidden = false
}
}
Error:个
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x6000005b7480 V:|-(9)-[UIView:0x7ff5ac9066e0] (active, names: '|':UITableViewCellContentView:0x7ff5ac90d4d0 )>",
"<NSLayoutConstraint:0x6000005b7520 UIView:0x7ff5ac9066e0.bottom == UITableViewCellContentView:0x7ff5ac90d4d0.bottom - 9 (active)>",
"<NSLayoutConstraint:0x6000005b7570 UIView:0x7ff5ac9066e0.height == 60 (active)>",
"<NSLayoutConstraint:0x60000059c3c0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7ff5ac90d4d0.height == 44 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x6000005b7570 UIView:0x7ff5ac9066e0.height == 60 (active)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
在单元格配置中,如果我注释为self.buttonOptions.isHidden = false
,则不会看到任何警告.我不知道我在这里遗漏了什么,请帮我解决这个问题.