Анимация изменения ограничения (второй элемент) с помощью Swift?

Я определил ограничение в IB, как показано ниже. Как я могу программно анимировать изменение «Второго элемента» в этом ограничении на другой объект (эффективно перемещая первый элемент вверх по экрану).

введите здесь описание изображения

Вот код, который я пробовал, где «categoryTableViewTop» — это NSLayoutConstraint. Я получаю сообщение об ошибке «Невозможно присвоить результат этого выражения».

func expandCategory(button: UIButton) {
    tableView2.animateWithDuration(0.5, animations: {
       categoryTableViewTop.secondItem = categoryHeader.top
    })
}

person vk2015    schedule 04.08.2015    source источник


Ответы (2)


Вы не меняете константы ограничения в своем коде. Вы должны изменить его следующим образом:

categoryTableViewTop.secondItem.constant = categoryHeader.top.constant

Я предполагаю, что secondItem и top IBOutlets из ограничений

Чтобы анимировать изменение ограничения, вы должны сделать это следующим образом:

self.view.layoutIfNeeded()
UIView.animateWithDuration(5, animations: { _ in
        // change your constraints here
        myTopConstraint.constant = 50.0
        self.view.layoutIfNeeded()
    }, completion: nil)

Для получения дополнительной информации прочитайте этот ответ или этот руководство из документы.

person ezcoding    schedule 04.08.2015
comment
Спасибо, но я не хочу менять константы ограничений, я хочу изменить элементы/объекты ограничений. Итак, categoryTableViewTop — это IBOutlet из ограничений. - person vk2015; 05.08.2015
comment
Если вы хотите переместить что-то на экране, как вы сказали в своем вопросе, вам придется обновить значения констант ограничения. Вы не можете просто назначить одну торговую точку другой и надеяться получить те же результаты. Ограничения вычисляются, поэтому вам нужно присвоить рассчитанное значение, а не сам объект. - person ezcoding; 05.08.2015

Ограничения не позволяют вам изменить secondItem в коде, потому что это атрибут только для чтения.

Я не пробовал это с анимацией, но с другими динамическими макетами можно создать два разных ограничения с разными secondItems в построителе интерфейса и изменить их приоритеты в коде. Вы можете попробовать, работает ли тот же подход с анимацией.

Используйте приоритеты 750 и 250, так как эти ограничения рассматриваются как необязательные.

person liitokone    schedule 09.03.2017
comment
Используйте приоритеты 750 и 250, так как эти ограничения рассматриваются как необязательные. правильное решение - person ; 21.06.2018