Анимация изменения цвета фона-из стороны в сторону
Предположим, что у меня есть прямоугольник горизонтальной длины. Она голубая. Я хочу, чтобы он был красным. Однако я хочу, чтобы изменение цвета начиналось с одной стороны и заканчивалось с другой.
Я могу использовать анимацию ключевого кадра, чтобы весь вид постепенно менялся с красного на синий. Есть ли способ постепенно изменить его слева направо/справа налево??
UIView.animateKeyframesWithDuration(2.0 /*Total*/, delay: 0.0, options: UIViewKeyframeAnimationOptions.CalculationModeLinear, animations: {
UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 1/1, animations:{
self.view.backgroundColor = UIColor.redColor()
self.view.layoutIfNeeded()
})
},
completion: { finished in
if (!finished) { return }
})
2 ответа:
Взгляните на CAGradientLayer. Вы можете оживить его
Вот краткий фрагмент, который вы можете вставить в playground и посмотреть, как он может работать. В данном случае я анимирую градиенты цветовых локаций.locations
,colors
илиendPoint
иstartPoint
import UIKit import XCPlayground XCPlaygroundPage.currentPage.needsIndefiniteExecution = true let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 400)) let startLocations = [0, 0] let endLocations = [1, 2] let layer = CAGradientLayer() layer.colors = [UIColor.redColor().CGColor, UIColor.blueColor().CGColor] layer.frame = view.frame layer.locations = startLocations layer.startPoint = CGPoint(x: 0.0, y: 1.0) layer.endPoint = CGPoint(x: 1.0, y: 1.0) view.layer.addSublayer(layer) let anim = CABasicAnimation(keyPath: "locations") anim.fromValue = startLocations anim.toValue = endLocations anim.duration = 2.0 layer.addAnimation(anim, forKey: "loc") layer.locations = endLocations XCPlaygroundPage.currentPage.liveView = view
Swift 3 версия:
import UIKit import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 400)) let startLocations = [0, 0] let endLocations = [1, 2] let layer = CAGradientLayer() layer.colors = [UIColor.red.cgColor, UIColor.blue.cgColor] layer.frame = view.frame layer.locations = startLocations as [NSNumber]? layer.startPoint = CGPoint(x: 0.0, y: 1.0) layer.endPoint = CGPoint(x: 1.0, y: 1.0) view.layer.addSublayer(layer) let anim = CABasicAnimation(keyPath: "locations") anim.fromValue = startLocations anim.toValue = endLocations anim.duration = 2.0 layer.add(anim, forKey: "loc") layer.locations = endLocations as [NSNumber]? PlaygroundPage.current.liveView = view