2017-02-03 11 views
4

Я использую SnapKit и не могу найти чистый способ обновления смещения ограничения. Это простой вид загрузочной панели, внутренний вид которого (expiredTime) должен заполнить родительский (слева направо) в соответствии с процентом.Обновление смещения смещения SnapKit

Я создаю ограничение в awakeFromNib заказного UIView

self.expiredTime.snp.makeConstraints { (make) in 
     make.left.equalTo(self) 
     make.top.equalTo(self) 
     make.bottom.equalTo(self) 
     self.constraintWidth = make.width.equalTo(self).constraint 
    } 
    setNeedsUpdateConstraints() 

тогда, когда время обновляется я называю setNeedsUpdateConstraints() который будет запускать updateConstraints по умолчанию(), который был перегружен, как яблочные намек:

не работает: (вид expiredTime всегда вяжется с родительской точки зрения)

override func updateConstraints() { 

    let offset = self.frame.width * CGFloat(percentage) 

    self.expiredTime.snp.updateConstraints { (make) in 
     make.width.equalTo(self).offset(offset).constraint 
    } 
    super.updateConstraints() 
} 

Это также не работает:

override func updateConstraints() { 
    let offset = self.frame.width * CGFloat(percentage) 
    self.constraintWidth?.update(offset: offset) 
    super.updateConstraints() 
} 

Перестройка все ограничения работает, но я хотел бы избежать этого

override func updateConstraints() { 

    self.expiredTime.snp.remakeConstraints() { (make) in 
     make.left.equalTo(self) 
     make.top.equalTo(self) 
     make.bottom.equalTo(self) 
     self.constraintWidth = make.width.equalTo(self).multipliedBy(self.percentage).constraint 
    } 
    super.updateConstraints() 
} 

ответ

6

Ваше первое решение не работает, потому что вы уже установили width вашего истекшего времени просмотра до полной ширины перед добавлением смещения. Чтобы заставить его работать, вы должны установить ширину 0, а затем добавить смещение. Но смещение действительно здесь не нужен, вы можете просто установить ширину расчетной ширины:

override func updateConstraints() { 
    let width = self.frame.width * CGFloat(percentage) 
    self.expiredTime.snp.updateConstraints { (make) in 
     make.width.equalTo(width) 
    } 
    super.updateConstraints() 
} 

Или если вы сохранить ссылку на ограничения вы не должны переопределять updateConstraints() вообще. Вы можете просто вызвать update метод ограничения (без вызова setNeedsUpdateConstraints() впоследствии)

constraintWidth?.update(offset: CGFloat(percentage) * view.bounds.width) 

Только не забудьте установить ширину 0 при инициализации constraintWidth:

self.expiredTime.snp.makeConstraints { (make) in 
    make.left.top.bottom.equalTo(self) 
    self.constraintWidth = make.width.equalTo(0).constraint 
} 
+0

Ahh хорошо, так что «смещение» не на самом деле смещение, а скорее значение. Проклятая номенклатура. Спасибо. – jalone