Изменить ограничение программно Swift

У меня такой контроллер в раскадровке :

storyboard_mainVC

Он всегда будет иметь 6 видов изображений, которые по умолчанию равны по ширине и высоте. Каждый вид изображения ограничен супервизором с:" равными высотами " и множителем 1/2.

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

Итак, мой интерфейс (at runtime) может выглядеть так:

second_interface

Я думаю, что мне нужно изменить константу множителя, но это только для чтения.

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

что бы вы порекомендовали ? Должен ли я удалить ограничение и добавить новое ? Если я не удалю его и не попытаюсь применить новую высоту ограничение, оно будет удалено автоматически для меня ?

Я должен использовать стручки как 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 просто проигнорирует его), но я не думаю, что это способ иди, зачем тебе это ненужное ограничение? Просто удалите его. Что касается сторонних движков и библиотек – к сожалению, я не могу дать вам никаких советов здесь.