为包含 CAGradientLayer 的 UIView 设置动画

Posted

技术标签:

【中文标题】为包含 CAGradientLayer 的 UIView 设置动画【英文标题】:Animate a UIView who contains a CAGradientLayer 【发布时间】:2018-08-11 15:14:40 【问题描述】:

我想修改具有 gradientLayer 的视图的宽度,但是当我添加渐变层时,这会阻止动画。

我给你看我的代码:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()
    animateProgressBar(leftPourcentage : 64)
    addGradientBarColor()


func addGradientBarColor(leftPourcentage : CGFloat)
    let leftColor = UIColor(rgb: 0x00ABBD)
    let rightColor = UIColor(rgb : 0x00DAFF)
    let gradientLayer = CAGradientLayer()
    gradientLayer.colors = [leftColor.cgColor,
                            rightColor.cgColor]

    gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
    gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
    gradientLayer.frame = CGRect.init(
        x: userBarLeft.bounds.origin.x,
        y: userBarLeft.bounds.origin.y,
        width: userBarLeft.frame.width,
        height: userBarLeft.frame.height)
    gradientLayer.masksToBounds = false
    gradientLayer.cornerRadius = 2
    userBarLeft.layer.insertSublayer(gradientLayer, at: 0)


func animateProgressBar(leftPourcentage : CGFloat)
    let widthOfTotalBarLeft = totalBarLeft.bounds.size.width

    leftBarWidthConstr.constant = widthOfTotalBarLeft * (leftPourcentage / 100)
    UIView.animate(withDuration: 2) 
        self.view.layoutIfNeeded()
     

这个给我看:

没有动画作品。

当我删除 addGradientBarColor 函数时,这告诉我:

我想要动画但带有渐变。我怎样才能做到这一点?

【问题讨论】:

您无法使用视图动画 (UIView.animate) 为层的布局设置动画。使用渐变 view 而不是渐变层。参见例如***.com/questions/51543409/… 【参考方案1】:

这是因为您将渐变宽度设置为

width: userBarLeft.frame.width,

就这样吧

width:0,

并为其宽度设置动画

【讨论】:

感谢您的回复,当我在animate 部分添加此self.gradientLeftLayer.bounds.size.width = widthOfTotalBarLeft * (leftPourcentage / 100) 时,这不起作用。如何为 CAGradientLayer 的宽度设置动画? 在视图中嵌入渐变并为其完整帧设置动画

以上是关于为包含 CAGradientLayer 的 UIView 设置动画的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 CAGradientLayer 色点?

Swift 中的 CAGradientLayer 位置

CAGradientLayer 自转

CAGradientLayer 设置为场景包背景块场景

在 UITableViewCell 中的 UITextView 上使用 CAGradientLayer

为啥我的 CAGradientLayer 为所有更改设置动画?