UIView在操作后不会更新新的高度限制

时间:2019-11-29 21:11:57

标签: swift xcode uiview autolayout uiviewanimation

我有一个在执行操作(或者,当点击按钮时)之后更新UIView的高度的问题。 因此,基本上,我创建了一个名为“ BottleView”的UIView类,在该类中,还有另一个视图可以使瓶子内的“波动动画”动起来。

当百分比增加时,“动画视图”的高度会增加并更新。当百分比下降时,高度会降低并更新。

每当它减小时,它将立即更新“动画视图”的高度。但是当增加高度时,它不会立即更新。为了查看更新的高度限制,我必须重新启动该应用程序。

我错过了一步吗?这是出于视觉目的的gif,下面是我的代码

Bottle GIF

class BottleView: UIView {

    let liquidView = AnimationView()
    let shapeView = UIImageView()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup() {
        self.backgroundColor = .blue

        self.shapeView.contentMode = .scaleAspectFit
        self.shapeView.image = UIImage(named: "water-bottle")

        self.addSubview(liquidView)
        self.mask = shapeView

        liquidView.anchor(top: .none, leading: leadingAnchor, bottom: bottomAnchor, trailing: trailingAnchor)

        layoutIfNeeded()

        playWavesAnimation()
        animationObserver()
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        shapeView.frame = self.bounds

        NotificationCenter.default.post(name: NSNotification.Name("refreshWaveForBottle"), object: nil)
    }
}

extension BottleView {

    fileprivate func animationObserver() {
         NotificationCenter.default.addObserver(self, selector: #selector(refreshWaterAnimation), name: NSNotification.Name("refreshWaveForBottle"), object: nil)
     }

    @objc func refreshWaterAnimation() {
        NetworkManager.fetchPercentageAmount { (value) in

            DispatchQueue.main.async {
                if value > 0 && value <= 5 {
                    self.liquidView.constrainHeight(constant: 50)
                    self.liquidView.layoutIfNeeded()
                }

                if value > 5 && value <= 10 {
                    self.liquidView.constrainHeight(constant: 80)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 10 && value <= 15 {
                    self.liquidView.constrainHeight(constant: 100)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 15 && value <= 20 {
                    self.liquidView.constrainHeight(constant: 150)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 20 && value <= 25 {
                    self.liquidView.constrainHeight(constant: 200)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 25 && value <= 30 {
                    self.liquidView.constrainHeight(constant: 250)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 30 && value <= 35 {
                    self.liquidView.constrainHeight(constant: 300)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 35 && value <= 40 {
                    self.liquidView.constrainHeight(constant: 350)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 40 && value <= 45 {
                    self.liquidView.constrainHeight(constant: 400)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 45 && value <= 50 {
                    self.liquidView.constrainHeight(constant: 500)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 50 && value <= 55 {
                    self.liquidView.constrainHeight(constant: 600)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 55 && value <= 60 {
                    self.liquidView.constrainHeight(constant: 700)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 60 && value <= 65 {
                    self.liquidView.constrainHeight(constant: 800)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 65 && value <= 70 {
                    self.liquidView.constrainHeight(constant: 900)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 70 && value <= 75 {
                    self.liquidView.constrainHeight(constant: 1000)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 75 && value <= 80 {
                    self.liquidView.constrainHeight(constant: 1100)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 80 && value <= 85 {
                    self.liquidView.constrainHeight(constant: 1200)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 85 && value <= 90 {
                    self.liquidView.constrainHeight(constant: 1300)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 90 && value <= 95 {
                    self.liquidView.constrainHeight(constant: 1400)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 95 && value <= 98 {
                    self.liquidView.constrainHeight(constant: 1450)
                    self.liquidView.layoutIfNeeded()

                }

                if value > 98 {
                    self.liquidView.constrainHeight(constant: 1800)
                    self.liquidView.layoutIfNeeded()

                }

                if value < 1 {
                    self.liquidView.frame.origin.y = self.bounds.height
                }
            }
        }
    }
}

extension BottleView {

    fileprivate func playWavesAnimation() {
        let waveAnimation = Animation.named(waveJSONFile)
        liquidView.animation = waveAnimation
        liquidView.clipsToBounds = true
        liquidView.animationSpeed = 2.0
        liquidView.respectAnimationFrameRate = false
        liquidView.contentMode = .scaleAspectFill
        liquidView.loopMode = .loop
        liquidView.backgroundBehavior = .pauseAndRestore
        liquidView.play()
      }
}

万一你们想知道“约束高度”是做什么的...这是自动布局的辅助方法。

extension UIView {
    func constrainHeight(constant: CGFloat) {
        translatesAutoresizingMaskIntoConstraints = false
        heightAnchor.constraint(equalToConstant: constant).isActive = true
    }
}

1 个答案:

答案 0 :(得分:2)

您需要删除旧的1

extension UIView {
    func constrainHeight(constant: CGFloat) {
        constraints.forEach {
           if $0.firstAttribute == .height {
                self.removeConstraint($0)
           }
        } 

        heightAnchor.constraint(equalToConstant: constant).isActive = true
        superView!.layoutIfNeeded()
    }
}