Одушевленное ограничение по отношению к другому - PullRequest
0 голосов
/ 12 марта 2019

Я настроил анимацию, чтобы скрыть один переключатель / метку, когда включен другой.Одновременно только что включенный переключатель перемещается вверх.Это прекрасно работает с простым объяснением здесь .

Однако, когда я пытаюсь переместить переключатель / метку обратно после его выключения, он не сдвинется с места.Другой переключатель снова появляется нормально, но изменение верхнего ограничения не срабатывает.

Я относительно новичок в настройке этого типа и анимации всего программно, и, потратив час на это, я озадачен.Это потому, что я анимирую верхнее ограничение относительно другого?Какое это имеет значение, если это работает с первого раза?Даже если альфа скрытого переключателя установлена ​​в ноль, его кадр все еще там, верно?Или я что-то просто тупо делаю?

// Works Perfectly!

func hideVeg() {

    self.view.layoutIfNeeded()

    UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseIn], animations: {
        self.vegetarianSwitch.alpha = 0
        self.vegetarianLabel.alpha = 0
        self.veganSwitch.topAnchor.constraint(equalTo: self.vegetarianSwitch.bottomAnchor, constant: -30).isActive = true
        self.view.layoutIfNeeded()
    })
}

// Showing the label and switch works, but the topAnchor constraint never changes!

func showVeg() {

    self.view.layoutIfNeeded()

    UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseIn], animations: {
        self.vegetarianSwitch.alpha = 1
        self.vegetarianLabel.alpha = 1

        // This is the constraint that doesn't change.
        // This is exactly what it was set to before the other hideVeg() runs.
        self.veganSwitch.topAnchor.constraint(equalTo: self.vegetarianSwitch.bottomAnchor, constant: 40).isActive = true
        self.view.layoutIfNeeded()
    })
}

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Константа должна быть изменена с анимацией, не создавая совершенно нового ограничения.Старое ограничение все еще существует, вызывая проблему.

var veganTopConstraint = NSLayoutConstraint()

// Top Constraint set up this way so it can be animated later.
veganTopConstraint = veganSwitch.topAnchor.constraint(equalTo: vegetarianSwitch.bottomAnchor, constant: 40)
veganTopConstraint.isActive = true


func hideVeg() {

    UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseIn], animations: {
        self.vegetarianSwitch.alpha = 0
        self.vegetarianLabel.alpha = 0

        self.veganTopConstraint.constant = -30

        self.view.layoutIfNeeded()
    })
}

func showVeg() {

    self.view.layoutIfNeeded()

    UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseIn], animations: {
        self.vegetarianSwitch.alpha = 1
        self.vegetarianLabel.alpha = 1

        self.veganTopConstraint.constant = 40

        self.view.layoutIfNeeded()
    })
}
0 голосов
/ 12 марта 2019

Проблема здесь в том, что вы не изменяете ограничения, а фактически создаете новые ограничения для каждой анимации.Вместо этого вам нужно просто создать ограничение один раз (вы можете сделать это в коде или в Интерфейсном Разработчике и перетаскивать их).Затем вы можете просто изменить поле .constant существующего ограничения в блоке анимации.

...