代码之家  ›  专栏  ›  技术社区  ›  Aakash Dave

通过layoutIfNeeded()设置特定约束更改的动画

  •  0
  • Aakash Dave  · 技术社区  · 6 年前

    我已经通过编程构建了视图,然后设置了它们的动画。有一个视图链动画,最后一个是要设置动画的按钮。

    当我通过调用layoutIfNeeded()更改约束(这些约束独立于其他约束,并且没有其他视图与之铰接)来设置按钮的动画时,所有的视图都会更改并转到动画的初始位置。

    我甚至尝试了很多其他的方法,比如改变alpha值或者让它消失。但每一次,它都会改变整个观点。

    有没有办法只改变一个特定的约束 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 回复  |  直到 6 年前
        1
  •  1
  •   matt    6 年前

    问题是你的第一个动画会改变它们的视图 框架 ,如 self.bannerTwoItemContainer.frame.origin.x 约束条件 . 如果这样做,那么一旦出现布局,约束就会重新出现。这正是你正在做的,也正是发生的。你说呢 layoutIfNeeded

    重写你的第一个动画,改变他们的视图约束,而不是他们的框架,一切都会很好。