import UIKit
open class GradientView: UIView {
fileprivate struct AnimationKey {
static let colors = "colors"
static let colorChange = "ColorChange"
}
public enum Point {
case left, right
case top, bottom
/// 上部分邊角
case upperLeft, upperRight
/// 下部分邊角
case lowerLeft, lowerRight
case custom(position: CGPoint)
var point: CGPoint {
switch self {
case .left: return CGPoint(x: 0, y: 0.5)
case .right: return CGPoint(x: 1, y: 0.5)
case .top: return CGPoint(x: 0.5, y: 0)
case .bottom: return CGPoint(x: 0.5, y: 1)
case .upperLeft: return CGPoint(x: 0, y: 0)
case .upperRight: return CGPoint(x: 1, y: 0)
case .lowerLeft: return CGPoint(x: 0, y: 1)
case .lowerRight: return CGPoint(x: 1, y: 1)
case .custom(position: let point): return point
}
}
}
open var startPoint: Point = .upperRight
open var endPoint: Point = .lowerLeft
open var animationDuration: CFTimeInterval = 3.0
fileprivate let gradientLayer = CAGradientLayer()
fileprivate var currentGradient = 0
fileprivate var colors = [#colorLiteral(red: 0.6117647059, green: 0.1529411765, blue: 0.6901960784, alpha: 1), #colorLiteral(red: 1, green: 0.2509803922, blue: 0.5058823529, alpha: 1), #colorLiteral(red: 0.4823529412, green: 0.1215686275, blue: 0.6352941176, alpha: 1), #colorLiteral(red: 0.1254901961, green: 0.2980392157, blue: 1, alpha: 1), #colorLiteral(red: 0.1254901961, green: 0.6196078431, blue: 1, alpha: 1), #colorLiteral(red: 0.3529411765, green: 0.4705882353, blue: 0.4980392157, alpha: 1), #colorLiteral(red: 0.2274509804, green: 1, blue: 0.8509803922, alpha: 1)]
open override func removeFromSuperview() {
super.removeFromSuperview()
gradientLayer.removeAllAnimations()
gradientLayer.removeFromSuperlayer()
}
}
extension GradientView {
open func startAnimation() {
gradientLayer.removeAllAnimations()
setupGradientLayer()
setupAnimation()
}
open func set(colors: [UIColor]) {
guard colors.count > 0 else { return }
self.colors = colors
}
open func add(color: UIColor) {
colors.append(color)
}
}
extension GradientView {
fileprivate func setupGradientLayer() {
gradientLayer.frame = self.bounds
gradientLayer.colors = convertToCGColor()
gradientLayer.startPoint = startPoint.point
gradientLayer.endPoint = endPoint.point
gradientLayer.drawsAsynchronously = true
self.layer.insertSublayer(gradientLayer, at: 0)
}
fileprivate func convertToCGColor() -> [CGColor]? {
guard colors.count > 0 else { return nil }
return [colors[currentGradient % colors.count].cgColor,
colors[(currentGradient + 1) % colors.count].cgColor]
}
fileprivate func setupAnimation() {
currentGradient += 1
let animation = CABasicAnimation(keyPath: AnimationKey.colors)
animation.duration = animationDuration
animation.toValue = convertToCGColor()
animation.fillMode = kCAFillModeForwards
animation.isRemovedOnCompletion = false
animation.delegate = self
gradientLayer.add(animation, forKey: AnimationKey.colorChange)
}
}
extension GradientView: CAAnimationDelegate {
public func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
if flag {
gradientLayer.colors = convertToCGColor()
setupAnimation()
}
}
}
動態(tài)漸變動畫界面
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門鸿市,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人适贸,你說我怎么就攤上這事灸芳。” “怎么了拜姿?”我有些...
- 文/不壞的土叔 我叫張陵烙样,是天一觀的道長。 經(jīng)常有香客問我蕊肥,道長谒获,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任壁却,我火速辦了婚禮批狱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘展东。我一直安慰自己赔硫,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布盐肃。 她就那樣靜靜地躺著爪膊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砸王。 梳的紋絲不亂的頭發(fā)上推盛,一...
- 文/蒼蘭香墨 我猛地睜開眼嘹朗,長吁一口氣:“原來是場噩夢啊……” “哼师妙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骡显,我...
- 正文 年R本政府宣布,位于F島的核電站沛豌,受9級特大地震影響趋箩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜加派,卻給世界環(huán)境...
- 文/蒙蒙 一叫确、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芍锦,春花似錦竹勉、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至车胡,卻和暖如春檬输,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匈棘。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 前言 最近一直想寫個app,可是不知道想些啥肠仪,今天給大家分享一下 漸變動起來的效果 效果 因為gif圖比較大肖抱,所有...
- 1.QQ動態(tài)界面隱藏了navigation bar 和statusbar 隱藏導(dǎo)航條和狀態(tài)欄 2.附上代碼 // ...
- 放大漸變消失動畫意述,APP啟動界面常用 [UIView animateWithDuration:1.5 animat...
- 本人ios初學(xué)者,為自己學(xué)習(xí)方便吮蛹,復(fù)制各位大神的學(xué)習(xí)性文章放在自己簡書里荤崇,僅作為自己學(xué)習(xí)方便使用,如果作者疑此行為...
- ???????????????????????????????????????<????????>????????...