0

Ich versuche, einen Farbverlauf zu animieren, sodass sich die Positionen der beiden Farben von links nach rechts verschieben. Das Problem besteht darin, dass nach Abschluss der Animation die Farbverlaufspositionen an ihre ursprüngliche Position zurückspringen.Verhindern, dass CAGradientLayer-Positionen nach der Verwendung von CABasicAnimation zu ursprünglichen Werten zurückkehren

Hier ist mein Spielplatz Code:

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() 

Wie kann ich den Reset der Standorte zu verhindern, nachdem die Animation abgeschlossen ist?

Antwort

1

Sie können es einfach sagen, nicht auf Abschluss zu entfernen und die Standorte für die neuen Werte gesetzt:

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() 
} 

oder stellen Sie den fillMode und isRemovedOnCompletion entsprechend Eigenschaften.

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) 
} 
+1

Persönlich mag ich die letzte Lösung, weil es einen Abschlussblock hat .. aber es ist alles Vorliebe und Bedürfnisse. Entscheide selbst, was am besten zu dir passt. – Brandon

+0

Ich habe schon die erste Lösung ausprobiert, aber es funktioniert nicht. Ich werde die anderen 2 Lösungen versuchen. Bleib dran ... – DJSK

+0

Letzte Lösung ist die einzige, die funktioniert. Ich werde es als richtig markieren. Vielen Dank! – DJSK

Verwandte Themen