2015-07-22 29 views
15

Tôi đang suy nghĩ để tạo hiệu ứng cho CAGradientLayer bằng Swift. Đối với một nguồn tài nguyên Tôi đang sử dụng này postAnimate CAGradientLayer trong Swift

Đây là mã của tôi

class ViewController: UIViewController { 

    var gradient : CAGradientLayer?; 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    } 

    override func viewDidAppear(animated: Bool) { 

    self.gradient = CAGradientLayer() 
    self.gradient?.frame = self.view.bounds 
    self.gradient?.colors = [ UIColor.redColor().CGColor, UIColor.redColor().CGColor] 
    self.view.layer.insertSublayer(self.gradient, atIndex: 0) 

    animateLayer() 
    } 

    func animateLayer(){ 

    var fromColors = self.gradient?.colors 
    var toColors: [AnyObject] = [ UIColor.blueColor().CGColor, UIColor.blueColor().CGColor] 

    var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors") 

    animation.fromValue = fromColors 
    animation.toValue = toColors 
    animation.duration = 3.00 
    animation.removedOnCompletion = true 
    animation.fillMode = kCAFillModeForwards 
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    animation.delegate = self 

    self.gradient?.addAnimation(animation, forKey:"animateGradient") 
    } 
} 

Tôi đã cố gắng này trong Objective-C và nó hoạt động, nhưng tôi cần phải sử dụng nó trong Swift và khi tôi chạy chương trình nó hoạt hình nhưng quay trở lại màu trước đó ở cuối, tôi cần nó vẫn còn màu xanh.

Trả lời

24

Tôi đã kiểm tra mã của bạn và tìm thấy một lỗi ở đây. Bạn đã quên đặt màu là self.gradient bạn chỉ cho màu sắc cho hoạt ảnh đó là lý do hoạt ảnh hoạt động tốt và cuối cùng bạn thấy màu của nó quay lại red.

Viết mã này mất tích:

var toColors: [AnyObject] = [UIColor.blueColor().CGColor, UIColor.blueColor().CGColor] 
self.gradient.colors = toColors // You missed this line 
var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors") 

Bạn cũng có thể kiểm tra mã làm việc ở đây: Sample

UPDATE: làm thế nào để tôi lặp lại quá trình chuyển đổi gradient này liên tục?

Vì vậy, bạn có thể sử dụng delegate của CAAnimation. Nó sẽ cho bạn biết khi hoạt ảnh đã được hoàn thành và sau đó bạn có thể đặt giá trị fromColorstoColors và gọi hàm animateLayer() lặp đi lặp lại. Nhưng đối với điều này, bạn sẽ phải thực hiện một vài thay đổi trong mã của bạn.

  • Tạo fromColorstoColors toàn cầu.
  • Thay đổi giá trị của chúng trong phương thức đại diện animationDidStop.
  • Gọi lại chức năng animateLayer().

Đây là cơ quan delegate phương pháp:

override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { 

    self.toColors = self.fromColors; 
    self.fromColors = self.gradient?.colors 
    animateLayer() 
} 

Và bạn cũng có thể kiểm tra mã làm việc ở đây: Sample

+0

không thể tin rằng tôi đã không thấy rằng nhờ – DrPatience

+0

làm thế nào để tôi lặp lại quá trình chuyển đổi gradient này liên tục? – DrPatience

+0

@DrPatience Tôi trễ ... – TheTiger

0

Để tham khảo trong tương lai ... Việc sử dụng CPU 100% là do animationDidStop chức năng. Nó khởi động lại các hình ảnh động trong khi các hình động hiện tại không hoàn thành. Vui lòng kiểm tra cờ thành:

override func animationDidStop(anim: CAAnimation, finished: Bool) { 
    if finished { 
     self.toColors = self.fromColors; 
     self.fromColors = self.gradient?.colors 

     animateLayer() 
    } 
} 
1

Tôi đã cố gắng này trong Objective-C và nó hoạt động, nhưng tôi cần phải sử dụng nó trong Swift và khi tôi chạy chương trình nó sinh động nhưng đi trở lại màu trước đó ở cuối, tôi cần nó vẫn giữ màu xanh.

Bạn chỉ cần:

animation.removedOnCompletion = false // not true like in your code 
+0

Không đề nghị, nếu bạn thay đổi màu sắc một lần nữa nó sẽ không bắt đầu từ màu sắc hiện tại –