Невозможно удовлетворить нижнее ограничение UILabel для ContentView динамического UITableViewCell - PullRequest
0 голосов
/ 19 января 2019

Все реализации сделаны программно (без раскадровки!).

Я создал динамический tableView с UITableView.automaticDimension со всеми пользовательскими ячейками.Все ячейки работают нормально, и этот тоже один, но этот один генерирует предупреждения об ограничениях при отладке.

Хотя макет идеален и отображается так, как и должен.

Он имеет только одну метку и 3 слоя CAShapeLayers.Ниже приведен код реализации:

// BadCustomTableViewCell

override func layoutSubviews() {
    super.layoutSubviews()
    setUpViews()
    setUpConstraints()
}
let badLabel:UILabel = {
    let label = UILabel()
    label.font = UIFont.systemFont(ofSize: 40, weight: UIFont.Weight.light)
    label.text = "899"
    label.textColor = .black
    label.textAlignment = .center
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()
func setUpViews() {
    contentView.addSubview(badLabel)
}
func setUpConstraints() {
    badLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
    badLabel.layoutIfNeeded()
    let safeMargin:CGFloat = badLabel.frame.size.width - 15
    badLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: safeMargin).isActive = true
    badLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -safeMargin).isActive = true
}

У меня все хорошо, но я не понимаю, что нарушает ограничения!

Журнал показывает это -

(
"<NSLayoutConstraint:0x282729720 V:|-(77.6667)-[UILabel:0x103179a60'65.89 %']   (active, names: '|':UITableViewCellContentView:0x10317a150 )>",
"<NSLayoutConstraint:0x282729950 UILabel:0x103179a60'65.89 %'.bottom == UITableViewCellContentView:0x10317a150.bottom - 77.6667   (active)>",
"<NSLayoutConstraint:0x2827297c0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x10317a150.height == 48.6667   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x282729950 UILabel:0x103179a60'65.89 %'.bottom == UITableViewCellContentView:0x10317a150.bottom - 77.6667   (active)>

Есть идеи, что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Хотя уже довольно поздно, я все равно отправляю этот ответ . В большинстве случаев вам не нужно переустанавливать свои ограничения и повторно добавлять ваши подпредставления в ваше представление super / parent. Так что ваши setUpViews() и setUpConstraints() должны быть действительно внутри override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?), вот так:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    setUpViews()
    setUpConstraints()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Кроме того, вам не нужно (в большинстве случаев, опять же), по крайней мере для меня, устанавливать приоритеты для ваших ограничений. По мере возможности решайте проблемы / предупреждения об ограничениях без снижения приоритетов.

badLabel.layoutIfNeeded() тоже не требуется, если только вы на самом деле не изменяете некоторые константы своих ограничений или не делаете их заново. Хорошо, имеет смысл использовать такую ​​строку, если вы ДЕЙСТВИТЕЛЬНО хотите настроить все в вашем layoutSubviews()

Весь этот класс, похожий на вашу камеру, работал для меня:

class BadCustomTableViewCell: UITableViewCell {
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        setUpViews()
        setUpConstraints()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    let badLabel:UILabel = {
        let label = UILabel()
        label.font = UIFont.systemFont(ofSize: 40, weight: UIFont.Weight.light)
        label.text = "899"
        label.textColor = .black
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    func setUpViews() {
        contentView.addSubview(badLabel)
    }

    func setUpConstraints() {
        badLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
        let safeMargin:CGFloat = badLabel.frame.size.width - 15
        badLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: -safeMargin).isActive = true
        badLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: safeMargin).isActive = true
    }
}
0 голосов
/ 19 января 2019

Понизьте нижнее ограничение

let con = badLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -safeMargin)  
con.priority = UILayoutPriority(999)
con.isActive = true

и добавьте настройки и ограничения внутри

override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?)

, так как

override func layoutSubviews() 

вызывается несколько раз `

...