Первая проблема: как правило, вы никогда не должны изменять вид ячейки , например:
translatesAutoresizingMaskIntoConstraints = false
self.heightAnchor.constraint(equalToConstant: 100).isActive = true
, вместо этого изменяйте ячейку содержимое :
contentView.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
Далее, при использовании ячеек автоматического изменения размера и табличных представлений (или представлений коллекции), автоматическое расположение часто сталкивается с конфликтами, поскольку оно делает несколько проходов. Это связано с такими вещами, как разделители, размеры объекта и т. Д. c.
Этого можно избежать, используя priority
из 999
в ограничениях вместо значения по умолчанию 1000
:
// create heightAnchor for contentView
let c = contentView.heightAnchor.constraint(equalToConstant: 100.0)
// set priority to 999 to avoid auto-layout conflicts with auto-sizing cells
c.priority = UILayoutPriority(rawValue: 999)
// activate it
c.isActive = true
В-третьих, реализация heightForRowAt
почти никогда не требуется при использовании ячеек автоматического размещения и автоматического изменения размера. Если вы не знаете конкретно , почему вам нужно это реализовать, не надо.
Вот класс вашей ячейки, модифицированный с помощью приведенных выше примечаний:
class MyCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// never modify self in this way
//translatesAutoresizingMaskIntoConstraints = false
//self.heightAnchor.constraint(equalToConstant: 100).isActive = true
// create heightAnchor for contentView
let c = contentView.heightAnchor.constraint(equalToConstant: 100.0)
// set priority to 999 to avoid auto-layout conflicts with auto-sizing cells
c.priority = UILayoutPriority(rawValue: 999)
// activate it
c.isActive = true
// Set debug colors to visualize heigh
layer.borderWidth = 2
layer.borderColor = UIColor.blue.cgColor
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}