Анимировать конкретные изменения ограничений с помощью layoutIfNeeded () - PullRequest
0 голосов
/ 20 апреля 2019

Я программно построил представления и затем анимировал их. Есть цепочка видов анимации и последняя кнопка для анимации.

Хотя все работает нормально, как только я анимирую кнопку, изменяя ограничения (эти ограничения не зависят от других, и никакое другое представление не имеет привязки к нему), вызывая layoutIfNeeded (), все представления изменяются и переходят к их начальная позиция анимации.

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

Теперь я не могу выяснить точную причину. Ниже код этого.

Есть ли способ изменить только определенное ограничение с помощью layoutIfNeeded() или любой другой способ обработки этой функциональности?

import UIKit

var nextButton: UIButton!
var nextButtonHeightConstraint: NSLayoutConstraint?
var nextButtonWidthConstraint: NSLayoutConstraint?

override func viewDidLoad() {
    super.viewDidLoad()
    addNextButton()
}

// ..... function trigerred here.
@IBAction func triggerChange() {
    performCaptionAnimation()
}

func addNextButton() {
    nextButton = UIButton()
    nextButton.translatesAutoresizingMaskIntoConstraints = false
    nextButton.clipsToBounds = true
    nextButton.setTitle("Next", for: .normal)
    nextButton.backgroundColor = .white
    nextButton.isUserInteractionEnabled = true
    nextButton.titleLabel!.font = AvernirNext(weight: .Bold, size: 16)
    nextButton.setTitleColor(.darkGray, for: .normal)
    nextButton.roundAllCorners(withRadius: ActionButtonConstraint.height.anchor/2)
    nextButton.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(nextButtonPressed)))
    view.addSubview(nextButton)

    nextButtonHeightConstraint = nextButton.heightAnchor.constraint(equalToConstant: ActionButtonConstraint.height.anchor)
    nextButtonWidthConstraint = nextButton.widthAnchor.constraint(equalToConstant: ActionButtonConstraint.width.anchor)

    NSLayoutConstraint.activate([
        nextButton.rightAnchor.constraint(equalTo: view.rightAnchor, constant: ActionButtonConstraint.right.anchor),
        nextButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: ActionButtonConstraint.bottom.anchor),
        nextButtonHeightConstraint!, nextButtonWidthConstraint!
        ])
}

func performCaptionAnimation() {
    UIView.animate(withDuration: 0.4, delay: 0.0, options: [.curveEaseInOut], animations: {
        self.bannerTwoItemContainer.alpha = 1
        self.bannerTwoItemContainer.frame.origin.x -= (self.bannerTwoItemContainer.frame.width/2 + 10)
    }) { (done) in
        if done {
            UIView.animate(withDuration: 0.4, delay: 0.0, options: [.curveEaseInOut], animations: {
                self.bannerOneItemContainer.alpha = 1
                self.bannerOneItemContainer.frame.origin.x += self.bannerOneItemContainer.frame.width/2 + 10
            }) { (alldone) in
                if alldone {
                    // All changes here ......................
                    self.changeNextButtonContents()
                }
            }
        }
    }
}

// ------ This animation has issues and brings all the animation to it's initial point
func changeNextButtonContents() {
    self.nextButtonHeightConstraint?.constant = 40
    self.nextButtonWidthConstraint?.constant = 110
    UIView.animate(withDuration: 0.4, delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: [.curveEaseIn], animations: {
        self.nextButton.setTitleColor(.white, for: .normal)
        self.nextButton.setTitle("Try Now", for: .normal)
        self.nextButton.titleLabel?.font = AvernirNext(weight: .Bold, size: 18)
        self.nextButton.backgroundColor = blueColor
        self.nextButton.roundAllCorners(withRadius: 20)
        self.view.layoutIfNeeded()
    }, completion: nil)
}


1 Ответ

1 голос
/ 20 апреля 2019

Проблема заключается в том, что ваши первые анимации меняют кадр их представления, как в self.bannerTwoItemContainer.frame.origin.x. Но вы не можете изменить кадр чего-то, что позиционируется с помощью ограничений . Если вы это сделаете, то, как только макет произойдет, ограничения восстановятся. Это именно то, что вы делаете, и именно то, что происходит. Вы говорите layoutIfNeeded и ограничения, которые вы никогда не меняли, выполняются.

Перепишите свои первые анимации, чтобы изменить ограничения их представления, а не рамки, и все будет хорошо.

...