Изменить ограничение программно Swift
У меня такой контроллер в раскадровке :
Он всегда будет иметь 6 видов изображений, которые по умолчанию равны по ширине и высоте. Каждый вид изображения ограничен супервизором с:" равными высотами " и множителем 1/2.
однако, прежде чем загружать изображения внутрь, я читаю свойство, которое дает мне желаемую высоту для изображения (ширина никогда не будет изменена).
Итак, мой интерфейс (at runtime) может выглядеть так:
Я думаю, что мне нужно изменить константу множителя, но это только для чтения.
Я видел сообщения о том, что можем обновить постоянный свойство ограничения, но оно в точках, мне нужно, чтобы оно работало на каждом устройстве.
что бы вы порекомендовали ? Должен ли я удалить ограничение и добавить новое ? Если я не удалю его и не попытаюсь применить новую высоту ограничение, оно будет удалено автоматически для меня ?
Я должен использовать стручки как snapkit, чтобы сделать работу ?
Спасибо за помощь.
редактировать
вот код, который я пробовал, но не удалось:
for (index, (drawing, ratio)) in drawingElements.enumerate() {
drawingViews[index].image = UIImage(named: drawing)
// update height constraint if ratio is different than defaut ratio of 1/2
if ratio != 0.5 {
heightConstraints[index].active = false
let newHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Height, multiplier: ratio, constant: 0)
drawingViews[index].addConstraint(newHeightConstraint)
self.view.layoutIfNeeded()
}
}
Я делаю это неправильно ? Я не уверен в новом ограничении высоты, хотя
3 ответов
Так вот как я этого достиг:
-
создайте ограничение программно (высота в моем случае) :
// Drawing height property var drawingHeightConstraint: NSLayoutConstraint?
деактивировать старое ограничение и при необходимости установить новое
Примечание: heightContraints-это массив NSLayoutConstraint, который содержит мои выходы
for (index, (drawing, ratio)) in drawingElements.enumerate() {
drawingViews[index].image = UIImage(named: drawing)
// update height constraint if ratio is different than defaut ratio of 1/2
if ratio != 0.5 {
heightConstraints[index].active = false
drawingHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: .Height, relatedBy: .Equal, toItem: drawingView, attribute: .Height, multiplier: CGFloat(ratio), constant: 0)
drawingHeightConstraint!.active = true
}
}
- вызов layoutIfNeeded () сразу после (примечание :не уверен, когда звонить это)
константы ограничений связаны с содержимым ограниченного элемента. Вот почему вы получаете такой экран. Самый простой способ - создать изображение с прозрачным цветом и установить его по умолчанию. После завершения загрузки просто установите новое изображение для imageView
или вы можете установить IBOutlet для вашего ограничения высоты - и изменить его значение для разных ситуаций т. е.
if(download.completed)
ibHeightOutlet.constant = imageView.frame.size.height;
else
ibHeightOutlet.constant = initialImageViewHeght.frame.size.height;
вы не можете изменить множитель по неизвестным мне причинам (возможно, какая-то деталь реализации Apple). Однако можно удалить ограничение и создать новое. Вы должны удалить старое ограничение, потому что оно не будет удалено автоматически, и вы получите конфликт. Кроме того, вы можете создать первое ограничение (с помощью 0.5
множитель) с более низким приоритетом. Таким образом, вы можете сохранить его (autolayout просто проигнорирует его), но я не думаю, что это способ иди, зачем тебе это ненужное ограничение? Просто удалите его.
Что касается сторонних движков и библиотек – к сожалению, я не могу дать вам никаких советов здесь.