Модифицировать ограничение программно Swift

У меня есть следующий контроллер представления в моей раскадровке:

storyboard_mainVC

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

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

Таким образом, мой интерфейс (во время выполнения) может выглядеть так:

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()
            }
        }

Я делаю это неправильно? Я не уверен в новом ограничении высоты, хотя

Ответ 1

Так я и достиг этого:

  • Создать ограничение программно (высота в моем случае):

    // 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() сразу после (примечание: не уверен, когда его вызывать)

Ответ 2

Константы ограничений связаны с содержимым ограниченного элемента. Вот почему вы получаете такой экран. Самый простой способ - создать изображение с четким цветом и установить его по умолчанию. После завершения загрузки только что установили новое изображение для вашего ImageView

Или вы можете установить IBOutlet для ограничения по высоте - и изменить его значение для разных ситуаций то есть.

if(download.completed)
ibHeightOutlet.constant = imageView.frame.size.height;
else
ibHeightOutlet.constant = initialImageViewHeght.frame.size.height;

Ответ 3

Вы не можете изменить множитель по неизвестным причинам (возможно, какая-то деталь реализации Apple). Однако вы можете удалить ограничение и создать новый. Вам нужно удалить старое ограничение, потому что оно не будет удалено автоматически, и вы получите конфликт. В качестве альтернативы вы можете создать первое ограничение (с помощью множителя 0.5) с более низким приоритетом. Таким образом, вы могли бы сохранить его (автозапуск просто проигнорировал бы его), но я не думаю, что это способ, потому что для чего вам нужно это ненужное ограничение? Просто удалите его. Что касается сторонних механизмов компоновки и библиотек - к сожалению, я не могу дать вам никаких советов.