首页 > 解决方案 > 如何在动画后更新 CAGradientlayer 大小?

问题描述

我为 UIText 创建了一个扩展类来创建渐变层。在对 UIText 大小进行动画处理后,渐变层的大小变得小于作为父元素的 UIText itsef。这是我的代码:

extension UITextField {
func gradientBackground(firstColor: UIColor, secondColor: UIColor){
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = super.bounds
    gradientLayer.colors = [firstColor.cgColor, secondColor.cgColor]
    gradientLayer.locations = [0.0, 1.0]
    gradientLayer.startPoint = CGPoint(x:0.0, y:0.0)
    gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.0)
    layer.addSublayer(gradientLayer)  
}

class gradientTeLabel: UITextField {
    var once = true
    override func layoutSubviews() {  
        super.layoutSubviews()
        if once {
            self.gradientBackground(firstColor: UIColor(red: 0.30, green: 0.55, blue: 1.00, alpha: 1), secondColor: UIColor(red: 0.00, green: 0.36, blue: 1.00, alpha: 1))
            once = false
        }
    }

}

---------这些在单独的文件中--------

  @IBAction func showMarkUp(_ sender: Any) {
        if mark1.isHidden {
            _ = UIViewPropertyAnimator(duration: 0.25, curve: .easeInOut){

            self.expandButton.transform = CGAffineTransform(rotationAngle: .pi)
            self.asdf.layer.frame = self.asdf.bounds
                }.startAnimation()
            asdf.layer.frame = asdf.bounds
        } else {
            _ = UIViewPropertyAnimator(duration: 0.250, curve: .easeInOut){

            self.mark1.isHidden = true
                         }.startAnimation()
        }
    }

---------这些在 ViewController 中--------

asdf 是包含渐变层的 UITextField。如何更新渐变层大小以匹配 UIText 大小?

标签: iosswiftxcode

解决方案


你有两个主要选择。

  • 如果可能,不要像这样添加“松散”的子层。相反,添加一个子视图,其布局基于父视图(例如自动调整大小或自动布局),这样当您在父视图上执行视图动画时,子视图就会随之而来。

  • 如果你不能这样做,那么当你在视图上做视图动画时,你还必须在层上做层动画(使用核心动画)来匹配它。


推荐阅读