Активные ограничения в UITableViewCell не обновляются при обновлении из cellForRowAt - PullRequest
0 голосов
/ 11 июня 2018

У меня есть представление с двумя ведущими ограничениями, которые конфликтуют друг с другом.Один с ведущим смещением, другой без.Свойство «константа» работает для активного ограничения.Но я хочу включить / отключить ограничения, чтобы соответствовать моим потребностям.Он работает в любом месте, кроме UITableViewCell, когда вызывается из tableView:cellForRowAtIndexPath:.Вот моя ячейка:

class WowCell: UITableViewCell {
    @IBOutlet weak var myView: UIView!
    @IBOutlet var leading: NSLayoutConstraint!
    @IBOutlet var leadingSpace: NSLayoutConstraint!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func setup(ye:Bool) {
        setActiveConstraint(ye: ye)

        //doesn't help
        setNeedsLayout()
        layoutIfNeeded()
        needsUpdateConstraints()
        setNeedsUpdateConstraints()
        needsUpdateConstraints()
        setNeedsLayout()
        setNeedsDisplay()
    }

    func setActiveConstraint(ye:Bool){
        leading.isActive = !ye
        leadingSpace.isActive = ye
    }

    override func layoutSubviews() {
        //when called from here, it does work
    }
}

Заранее спасибо

Редактировать: Как советовал Прашант Тукадия, он работает путем изменения приоритетов обоих активных ограничений.Но имейте в виду, что оба ограничения должны быть ниже, чем 1000 .

func setActiveConstraint(ye:Bool){
    leading.priority  = UILayoutPriority(rawValue: !ye ? 999 : 250)
    leadingSpace.priority = UILayoutPriority(rawValue: ye ? 999 : 250)
}

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Попробуйте с приоритетом в качестве активного / деактивировать вызов ограничения addConstraint и removeConstraint внутри

func setActiveConstraint(ye:Bool){
    leading.priority  = !ye ? 999 : 250
    leading.priority = ye ? 999 : 250
}
0 голосов
/ 05 июля 2018

Есть способ сделать это без изменения приоритетов:

  1. Переопределить updateConstraints() в вашем UITableViewCell
  2. Активировать / деактивировать ограничение там
  3. Убедитесь, чтопозвонить super.updateConstraints() в конце
0 голосов
/ 11 июня 2018

Когда вы отключите ограничение, оно будет снято ARC, потому что это слабое свойство в вашем vc.Вы можете изменить, удалив слабый, чтобы справиться с этим.

@IBOutlet var leading: NSLayoutConstraint!
@IBOutlet var leadingSpace: NSLayoutConstraint!

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

...