在 UITableViewCell 中以编程方式添加的约束的奇怪行为 | Swift
Strange Behaviour of Constraints added Programatically in UITableViewCell | Swift
我有一个 tableViewCell
,我正在以编程方式对其进行约束。我在单元格中只有一个 ImageView
。现在我没有给单元格的 contentView
固定高度,而是给 imageView 顶部 contentView
的 top
和 bottom
,这样单元格高度会随着 imageView 的增加而增加身高。
messagingPersonProfilePicture.leadingAnchor.constraint(equalTo: self.leadingAnchor),
messagingPersonProfilePicture.topAnchor.constraint(equalTo: self.topAnchor, constant: 15),
messagingPersonProfilePicture.widthAnchor.constraint(equalToConstant: 50),
messagingPersonProfilePicture.heightAnchor.constraint(equalToConstant: 50),
messagingPersonProfilePicture.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -15),
现在,给出这些约束,程序正在打破这些约束,告诉我以下内容:
"<NSLayoutConstraint:0x6000034a4e60 V:|-(15)-[UIImageView:0x7fa7f6605640] (active, names: '|':Paigham.MessagesTableViewCell:0x7fa7f7809c00'tableCellID' )>",
"<NSLayoutConstraint:0x6000034a4f00 UIImageView:0x7fa7f6605640.height == 50 (active)>",
"<NSLayoutConstraint:0x6000034a4f50 UIImageView:0x7fa7f6605640.bottom == Paigham.MessagesTableViewCell:0x7fa7f7809c00'tableCellID'.bottom - 15 (active)>",
"<NSLayoutConstraint:0x600003494000 'UIView-Encapsulated-Layout-Height' Paigham.MessagesTableViewCell:0x7fa7f7809c00'tableCellID'.height == 80.5 (active)>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x6000034a4f00 UIImageView:0x7fa7f6605640.height == 50 (active)>
我认为这有点奇怪,因为 tableView 单元格从其子视图中获得了正确的高度。
但是一旦我将 tableView
separatorStyle
设置为 none
,约束就不会再被破坏了。这背后的原因是什么?
我的 tableViewMethods:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: tableCellID, for: indexPath) as! MessagesTableViewCell
cell.backgroundColor = .blue
return cell
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
我的自定义单元格代码:
class MessagesTableViewCell: UITableViewCell {
var messagingPersonProfilePicture: UIImageView = {
let v = UIImageView()
v.translatesAutoresizingMaskIntoConstraints = false
v.contentMode = .scaleAspectFill
v.image = #imageLiteral(resourceName: "unnamed-3")
v.layer.cornerRadius = 25
v.clipsToBounds = true
v.backgroundColor = .yellow
return v
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .default, reuseIdentifier: reuseIdentifier)
setupMessageCell()
}
func setupMessageCell() {
contentView.addSubview(messagingPersonProfilePicture)
NSLayoutConstraint.activate([
messagingPersonProfilePicture.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
messagingPersonProfilePicture.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 15),
messagingPersonProfilePicture.widthAnchor.constraint(equalToConstant: 50),
messagingPersonProfilePicture.heightAnchor.constraint(equalToConstant: 50),
messagingPersonProfilePicture.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -15),
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
编辑:
在您提供有关该问题的更多信息后,您的 heightAnchor
定义似乎与 TableView
默认单元格高度定义冲突。冲突的发生是因为UITableView
先loads/being布局时,将其cells的高度设置为0。这显然与您自己的约束冲突(设置高度为50 + 15 top + 15 bottom margin ).为了解决这个问题,您可以定义一个较低优先级的顶部或底部锚点。
let bottomConstraint = messagingPersonProfilePicture.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -15)
bottomConstraint.priority = .defaultHigh
bottomConstraint.isActive = true
我有一个 tableViewCell
,我正在以编程方式对其进行约束。我在单元格中只有一个 ImageView
。现在我没有给单元格的 contentView
固定高度,而是给 imageView 顶部 contentView
的 top
和 bottom
,这样单元格高度会随着 imageView 的增加而增加身高。
messagingPersonProfilePicture.leadingAnchor.constraint(equalTo: self.leadingAnchor),
messagingPersonProfilePicture.topAnchor.constraint(equalTo: self.topAnchor, constant: 15),
messagingPersonProfilePicture.widthAnchor.constraint(equalToConstant: 50),
messagingPersonProfilePicture.heightAnchor.constraint(equalToConstant: 50),
messagingPersonProfilePicture.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -15),
现在,给出这些约束,程序正在打破这些约束,告诉我以下内容:
"<NSLayoutConstraint:0x6000034a4e60 V:|-(15)-[UIImageView:0x7fa7f6605640] (active, names: '|':Paigham.MessagesTableViewCell:0x7fa7f7809c00'tableCellID' )>", "<NSLayoutConstraint:0x6000034a4f00 UIImageView:0x7fa7f6605640.height == 50 (active)>", "<NSLayoutConstraint:0x6000034a4f50 UIImageView:0x7fa7f6605640.bottom == Paigham.MessagesTableViewCell:0x7fa7f7809c00'tableCellID'.bottom - 15 (active)>", "<NSLayoutConstraint:0x600003494000 'UIView-Encapsulated-Layout-Height' Paigham.MessagesTableViewCell:0x7fa7f7809c00'tableCellID'.height == 80.5 (active)>"
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x6000034a4f00 UIImageView:0x7fa7f6605640.height == 50 (active)>
我认为这有点奇怪,因为 tableView 单元格从其子视图中获得了正确的高度。
但是一旦我将 tableView
separatorStyle
设置为 none
,约束就不会再被破坏了。这背后的原因是什么?
我的 tableViewMethods:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: tableCellID, for: indexPath) as! MessagesTableViewCell
cell.backgroundColor = .blue
return cell
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
我的自定义单元格代码:
class MessagesTableViewCell: UITableViewCell {
var messagingPersonProfilePicture: UIImageView = {
let v = UIImageView()
v.translatesAutoresizingMaskIntoConstraints = false
v.contentMode = .scaleAspectFill
v.image = #imageLiteral(resourceName: "unnamed-3")
v.layer.cornerRadius = 25
v.clipsToBounds = true
v.backgroundColor = .yellow
return v
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .default, reuseIdentifier: reuseIdentifier)
setupMessageCell()
}
func setupMessageCell() {
contentView.addSubview(messagingPersonProfilePicture)
NSLayoutConstraint.activate([
messagingPersonProfilePicture.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
messagingPersonProfilePicture.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 15),
messagingPersonProfilePicture.widthAnchor.constraint(equalToConstant: 50),
messagingPersonProfilePicture.heightAnchor.constraint(equalToConstant: 50),
messagingPersonProfilePicture.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -15),
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
编辑:
在您提供有关该问题的更多信息后,您的 heightAnchor
定义似乎与 TableView
默认单元格高度定义冲突。冲突的发生是因为UITableView
先loads/being布局时,将其cells的高度设置为0。这显然与您自己的约束冲突(设置高度为50 + 15 top + 15 bottom margin ).为了解决这个问题,您可以定义一个较低优先级的顶部或底部锚点。
let bottomConstraint = messagingPersonProfilePicture.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -15)
bottomConstraint.priority = .defaultHigh
bottomConstraint.isActive = true