Сломанные ограничения в ячейке - PullRequest
0 голосов
/ 19 мая 2018

Мне нужно показать некоторые UIView в моей ячейке, но размер этого UIView (backView) отличается для каждой ячейки.Поэтому мне нужно также изменить высоту этой ячейки.

Я пытаюсь изменить высоту и ширину этого backView во время выполнения, но все, что я получаю, это куча ошибок Autolayout, подобных этой:

[LayoutConstraints] Невозможно одновременно удовлетворить ограничения.Попытка восстановления путем нарушения ограничения ...

Я создал класс SimpleTextCell для этой ячейки, и его init выглядит так:

self.backView = UIView()
self.backView.translatesAutoresizingMaskIntoConstraints = false
self.backView.backgroundColor = UIColor.yellow
self.backView.layer.cornerRadius = 8.0
self.contentView.addSubview(backView)

let constraintBackViewTop = NSLayoutConstraint(item: backView, attribute: .top, relatedBy: .equal, toItem: contentView, attribute: .topMargin, multiplier: 1.0, constant: -5)
let constraintBackViewBottom = NSLayoutConstraint(item: backView, attribute: .bottom, relatedBy: .equal, toItem: contentView, attribute: .bottomMargin, multiplier: 1.0, constant: 5)
let constraintBackViewLeft = NSLayoutConstraint(item: backView, attribute: .left, relatedBy: .equal, toItem: contentView, attribute: .leftMargin, multiplier: 1.0, constant: 0)
constraintBackHeight = NSLayoutConstraint(item: backView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: superHeight)
constraintBackWidth = NSLayoutConstraint(item: backView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: superWidth)

self.contentView.addConstraints([constraintBackViewTop, constraintBackViewBottom, constraintBackViewLeft, constraintBackHeight, constraintBackWidth])

superHeight и superWidthздесь приведены только некоторые значения по умолчанию.

Моя cellForRowAt функция выглядит так:

let cell = tableView.dequeueReusableCell(withIdentifier: "simpleTextCell", for: indexPath) as! SimpleTextCell

cell.selectionStyle = .none
cell.backgroundColor = UIColor.red
cell.constraintBackHeight.constant = 100
cell.constraintBackWidth.constant = 200
cell.updateConstraints()

И она вообще не работает.У меня есть ошибки (вроде того, что я упоминал ранее), и хотя высота моей ячейки довольно правильная, мой backView невидим, потому что ширина backView.frame равна нулю (я понятия не имею, почему)и высота backView равна 100 (то же самое).Кажется, что мои новые ограничения игнорируются.

Я пытался установить приоритет для этих ограничений в cellForRowAt:

cell.constraintBackHeight.priority = UILayoutPriority.init(rawValue: 999)

В результате возникает ошибка времени выполнения.

Я пытался преодолеть эту ошибку примерно так:

cell.constraintBackHeight.isActive = false
cell.constraintBackHeight.priority = UILayoutPriority.init(rawValue: 999)
cell.constraintBackHeight.isActive = true

, но она тоже не работает.

Как я могу это исправить?

1 Ответ

0 голосов
/ 19 мая 2018

Проблема здесь

 constraintBackHeight = NSLayoutConstraint(item: backView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: superHeight)
 constraintBackWidth = NSLayoutConstraint(item: backView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: superWidth)

вы устанавливаете 2 ограничения по высоте, возможно, вы просто скопировали, чтобы сделать ширину, и забыли изменить ее на .width

...