gpt4 book ai didi

ios - 使用 CABasicAnimation 后防止 CAGradientLayer 位置返回到原始值

转载 作者:行者123 更新时间:2023-11-28 15:08:47 26 4
gpt4 key购买 nike

我正在尝试制作渐变动画,以便两种颜色的位置从左向右移动。问题在于,一旦动画完成,渐变位置就会弹回到原来的位置。

这是我的 Playground 代码:

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {

let gradientLayer: CAGradientLayer = {
let layer = CAGradientLayer()
layer.colors = [ UIColor.red.cgColor, UIColor.blue.cgColor ]
layer.locations = [0.0, 0.5]
layer.startPoint = CGPoint(x: 0.0, y: 1.0)
layer.endPoint = CGPoint(x: 1.0, y: 1.0)

return layer
}()

override func viewDidLoad() {
super.viewDidLoad()

view.layer.addSublayer(gradientLayer)
gradientLayer.frame = view.bounds

let gradientChangeAnimation = CABasicAnimation(keyPath: "locations")
gradientChangeAnimation.duration = 1
gradientChangeAnimation.toValue = [0.5, 1.0]
gradientLayer.add(gradientChangeAnimation, forKey: nil)

}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
gradientLayer.frame = view.frame
}
}

// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

如何防止在动画完成后重置位置?

最佳答案

您可以告诉它不要在完成时删除并将位置设置为新值:

override func viewDidLoad() {
super.viewDidLoad()

view.layer.addSublayer(gradientLayer)
gradientLayer.frame = view.bounds

CATransaction.begin()
CATransaction. setCompletionBlock {
gradientLayer.locations = [0.5, 1.0]
gradientLayer.removeAllAnimations()
}

let gradientChangeAnimation = CABasicAnimation(keyPath: "locations")
gradientChangeAnimation.duration = 1
gradientChangeAnimation.toValue = [0.5, 1.0]
gradientLayer.add(gradientChangeAnimation, forKey: nil)

CATransaction.commit()
}

或适本地设置 fillModeisRemovedOnCompletion 属性。

override func viewDidLoad() {
super.viewDidLoad()

view.layer.addSublayer(gradientLayer)
gradientLayer.frame = view.bounds

let gradientChangeAnimation = CABasicAnimation(keyPath: "locations")
gradientChangeAnimation.duration = 1
gradientChangeAnimation.toValue = [0.5, 1.0]
gradientChangeAnimation.fillMode = kCAFillModeForwards
gradientChangeAnimation.isRemovedOnCompletion = false
gradientLayer.add(gradientChangeAnimation, forKey: nil)
}

关于ios - 使用 CABasicAnimation 后防止 CAGradientLayer 位置返回到原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47997974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com