Если ваша цель состоит в том, чтобы все высоты строк были одинаковыми, с textLabel
по центру по вертикали, когда нет текста для detailTextLabel
, вы можете выполнить sh это с помощью ячейки Subtitle
по умолчанию, добавив эта строка в viewDidLoad()
:
tableView.rowHeight = 56
Редактировать
Эта опция не совместима с Dynami c Тип - это бросает немного ключ к выполнению задачи.
Один подход - это своего рода обходной путь, но он сделает свою работу:
- Пользовательская ячейка
- Начните с укладки это с надлежащими ограничениями, чтобы (близко) соответствовать ячейке субтитров по умолчанию
- Дублировать метку «Заголовок»
- Ограничить, чтобы дубликат метки был вертикально центрирован в ячейке
Затем, если ваши данные имеют , имеют текст субтитров, покажите метки заголовка и субтитров и скройте «дубликат» метки заголовка.
Если ваши данные НЕ имеет текст субтитров, скрывает заголовок и метки субтитров и показывает «дубликат» метка заголовка.
Вот простой пример, который вы можете попробовать:
class MySubtitleCell: UITableViewCell {
let myTextLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.font = UIFont.preferredFont(forTextStyle: .title1)
return v
}()
let myCenteredTextLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.font = UIFont.preferredFont(forTextStyle: .title1)
return v
}()
let myDetailTextLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.font = UIFont.preferredFont(forTextStyle: .subheadline)
return v
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
func commonInit() -> Void {
contentView.addSubview(myTextLabel)
contentView.addSubview(myCenteredTextLabel)
contentView.addSubview(myDetailTextLabel)
let g = contentView.layoutMarginsGuide
NSLayoutConstraint.activate([
myTextLabel.topAnchor.constraint(equalTo: g.topAnchor, constant: 7.0),
myTextLabel.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 0.0),
myDetailTextLabel.topAnchor.constraint(equalTo: myTextLabel.bottomAnchor, constant: 0.0),
myDetailTextLabel.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 0.0),
myDetailTextLabel.bottomAnchor.constraint(equalTo: g.bottomAnchor, constant: -7.0),
myCenteredTextLabel.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 0.0),
myCenteredTextLabel.centerYAnchor.constraint(equalTo: g.centerYAnchor, constant: 0.0),
])
// during development, un-comment this block
// to give labels background colors so we can see their frames
/*
myTextLabel.backgroundColor = .cyan
myDetailTextLabel.backgroundColor = .green
myCenteredTextLabel.backgroundColor = .yellow
*/
}
}
class DetailTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(MySubtitleCell.self, forCellReuseIdentifier: "MySTCell")
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var detailStr = "The detail text string"
// set detailStr empty for every-other row
if indexPath.row % 2 == 0 {
// set it to a space char " " instead of "" to maintain label frame
detailStr = " "
}
let cell = tableView.dequeueReusableCell(withIdentifier: "MySTCell", for: indexPath) as! MySubtitleCell
// set same text for myTextLabel and myCenteredTextLabel
cell.myTextLabel.text = "Row: \(indexPath.row)"
cell.myCenteredTextLabel.text = cell.myTextLabel.text
// set myDetailTextLabel
cell.myDetailTextLabel.text = detailStr
// if detailStr is not empty (" ")
// hide myTextLabel and myDetailTextLabel and show myCenteredTextLabel
// else
// show myTextLabel and myDetailTextLabel and hide myCenteredTextLabel
cell.myTextLabel.isHidden = (detailStr == " ")
cell.myDetailTextLabel.isHidden = cell.myTextLabel.isHidden
cell.myCenteredTextLabel.isHidden = !cell.myTextLabel.isHidden
return cell
}
}
Результаты (все остальные строки не имеют подробного текста метки) ...
С размерами шрифта «по умолчанию»:
и тем же экраном, с большими шрифтами через Accessibility / Dynami c Тип: