你應該繼承UIView類來創建一個GradientView類。添加一個數組來保存您正在移動的顏色。選擇很重要,我解釋了原因。覆蓋的drawRect(RECT:的CGRect)方法和顏色的部件之間進行內插:
override func drawRect(rect: CGRect) {
let context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
let c1 = colors[index == 0 ? (colors.count - 1) : index - 1] // previous
let c2 = colors[index] // current
let c3 = colors[index == (colors.count - 1) ? 0 : index + 1] // next
var c1Comp = CGColorGetComponents(c1.CGColor)
var c2Comp = CGColorGetComponents(c2.CGColor)
var c3Comp = CGColorGetComponents(c3.CGColor)
var colorComponents = [
c1Comp[0] * (1 - factor) + c2Comp[0] * factor, // color 1 and 2
c1Comp[1] * (1 - factor) + c2Comp[1] * factor,
c1Comp[2] * (1 - factor) + c2Comp[2] * factor,
c1Comp[3] * (1 - factor) + c2Comp[3] * factor,
c2Comp[0] * (1 - factor) + c3Comp[0] * factor, // color 2 and 3
c2Comp[1] * (1 - factor) + c3Comp[1] * factor,
c2Comp[2] * (1 - factor) + c3Comp[2] * factor,
c2Comp[3] * (1 - factor) + c3Comp[3] * factor
]
let gradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), &colorComponents, [0.0, 1.0], 2)
let startPoint = CGPoint(x: 0.0, y: 0.0)
let endPoint = CGPoint(x: rect.size.width, y: rect.size.height)
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, CGGradientDrawingOptions.DrawsAfterEndLocation)
CGContextRestoreGState(context);
}
索引變量從0開始和顏色陣列周圍纏繞而因子是0.0和1.0之間和動畫通過計時器:
var index: Int = 0
var factor: CGFloat = 1.0
var timer: NSTimer?
func animateToNextGradient() {
index = (index + 1) % colors.count
self.setNeedsDisplay()
self.factor = 0.0
self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0/60.0, target: self, selector: "animate:", userInfo: nil, repeats: true)
}
func animate(timer: NSTimer) {
self.factor += 0.02
if(self.factor > 1.0) {
self.timer?.invalidate()
}
self.setNeedsDisplay()
}
好了,我試圖創建一個梯度層大於屏幕(3×屏幕高度),和動畫其position.y,它工作,直到position.y>屏幕origin.y 。我是否創建另一個漸變並將其放置在第一個漸變下面,以便它繼續下去,在更大的漸變圖層熄滅屏幕之後如何保持動畫不變?我認爲只需創建一個超長的CAGradientLayer,並將其位置設置爲動畫。並不一定是答案,因爲它最終可能會結束。我希望它永遠生動。 – Supereid86
那麼,當它到達一個循環點時,你會將位置重置到頂部(沒有動畫),然後再次循環。 – jrturton
工作就像一個魅力。一個評論 - 我需要創建2個CAGradientLayers,一個紅色藍色紅色,另一個紅色藍色紅色。我把另一個放在另一個的上面(一個在頂部,一個在第一個的末尾開始),我激活了兩個位置,直到第一個出現在屏幕上,第二個出現在第一個的起始位置。然後,我在沒有動畫的情況下將第一個動作移動到第二個動畫,然後再次爲position.y生成動畫。謝謝@jrtuton! – Supereid86