簡單實現(xiàn)帶漸變色的折線圖

tip:僅僅是CAShapeLayer,CAGradientLayer的簡單使用案例

先上效果圖:

就是這個小東西.gif

原理:

實現(xiàn)中用到的兩個Layer屹耐,一個CAGradientLayer用來生成漸變色,兩個CAShapeLayer窍育,一個用來劃線,另一個用來做CAGradientLayer的mask用于顯示出所劃線下面的漸變區(qū)域在辆。動畫规揪,直接通過timer,循環(huán)遞增點來實現(xiàn)乍赫。

具體實現(xiàn):

設(shè)置layer:

添加layer.png

這個沒啥可說的瓣蛀,給View的layer添加一個GradientLayer和一個LineLayer,給GradientLayer添加一個mask

畫線:


畫線.png

(1)currentIndex是當前已經(jīng)畫到的點,當畫到currentIndex時雷厂,剛好得到第一個點到currentIndex點的線路徑惋增,這時給lineLayer賦值Path,

(2)繼續(xù)從currentIndex點依次連接currentIndex和第一個點對應(yīng)的X軸點改鲫,然后回到第一個點诈皿。此時Path是一個封閉的圖形林束,這時給MaskLayer賦值。

整個路徑就算畫完了稽亏,繼續(xù)進行下一個點壶冒。循環(huán)就生成動畫。

然后就寫完了截歉,太簡單了胖腾。可能是還有好多事沒做瘪松。比如咸作,一個圖怎么能沒有X、Y坐標的值呢宵睦,圖形的走勢是反的记罚,原因是View的原點在左上,我們常識中的折線圖是左下状飞。但這些都不是我要寫篇文章的要點毫胜,我只是想用用CAShapeLayer和CAGradientLayer。

以下是示例代碼:



import UIKit

class KKLineChart: UIView {
    
    
    var granLayer = CAGradientLayer()
    var maskLayer = CAShapeLayer()
    var lineLayer = CAShapeLayer()
    
    var timer: Timer?
    
    var currentIndex: Int = 1

    private lazy var dataArray:[CGPoint] = {
    
        var floatArray:[CGPoint] = []
        for i in 1...20{
            let x: CGFloat = CGFloat(i * 15)
            let y: CGFloat = CGFloat(arc4random() % 100) + 20
            let point = CGPoint(x: x, y: y)
            floatArray.append(point)
        }
        
        return floatArray
        
    }()
    
    
    override func didMoveToSuperview() {
        super.didMoveToSuperview()
        
        granLayer.colors = [#colorLiteral(red: 1, green: 0.4664840698, blue: 0.2368942201, alpha: 1).cgColor,#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1).cgColor]
        granLayer.startPoint = CGPoint(x: 0.5, y: 0)
        granLayer.endPoint = CGPoint(x: 0.5, y: 1)
        
        maskLayer.fillColor = UIColor.black.cgColor
    
        lineLayer.strokeColor = #colorLiteral(red: 1, green: 0.4664840698, blue: 0.2368942201, alpha: 1).cgColor
        lineLayer.fillColor = UIColor.clear.cgColor
        
        layer.addSublayer(granLayer)
        granLayer.mask = maskLayer
        layer.addSublayer(lineLayer)
        
        drawLine()
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()

        granLayer.frame = bounds
        maskLayer.frame = granLayer.bounds
        lineLayer.frame = bounds
        
        
    }
    
    private func drawLine(){
    
        currentIndex = 1
        timer = Timer.scheduledTimer(withTimeInterval: 0.03, repeats: true, block: { (timer) in
            let path = UIBezierPath()
            let fistPoint = self.dataArray[0]
            let lastPoint = self.dataArray[self.currentIndex]
            
            path.move(to: fistPoint)
            for (index,point) in self.dataArray.enumerated(){
                if self.currentIndex < index {break}
                if index != 0 {
                    path.addLine(to: point)
                }
            }
            self.lineLayer.path = path.cgPath
            
            let fistX = CGPoint(x: fistPoint.x, y: self.bounds.height)
            let lastX = CGPoint(x: lastPoint.x, y: self.bounds.height)
            path.addLine(to: lastX)
            path.addLine(to: fistX)
            path.addLine(to: fistPoint)
            self.maskLayer.path = path.cgPath
            
            self.currentIndex += 1
            if self.currentIndex == self.dataArray.count{timer.invalidate()}
        })
        
       
    }
    
    
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诬辈,一起剝皮案震驚了整個濱河市酵使,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焙糟,老刑警劉巖口渔,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異穿撮,居然都是意外死亡缺脉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門悦穿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攻礼,“玉大人,你說我怎么就攤上這事栗柒〗赴纾” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵瞬沦,是天一觀的道長太伊。 經(jīng)常有香客問我,道長逛钻,這世上最難降的妖魔是什么僚焦? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮曙痘,結(jié)果婚禮上芳悲,老公的妹妹穿的比我還像新娘立肘。我一直安慰自己,他們只是感情好芭概,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布赛不。 她就那樣靜靜地躺著,像睡著了一般罢洲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上文黎,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天惹苗,我揣著相機與錄音,去河邊找鬼耸峭。 笑死桩蓉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的劳闹。 我是一名探鬼主播院究,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼本涕!你這毒婦竟也來了业汰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤菩颖,失蹤者是張志新(化名)和其女友劉穎样漆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晦闰,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡放祟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呻右。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跪妥。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖声滥,靈堂內(nèi)的尸體忽然破棺而出眉撵,到底是詐尸還是另有隱情,我是刑警寧澤醒串,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布执桌,位于F島的核電站,受9級特大地震影響芜赌,放射性物質(zhì)發(fā)生泄漏仰挣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一缠沈、第九天 我趴在偏房一處隱蔽的房頂上張望膘壶。 院中可真熱鬧错蝴,春花似錦、人聲如沸颓芭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亡问。三九已至官紫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間州藕,已是汗流浹背束世。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留床玻,地道東北人毁涉。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像锈死,于是被迫代替她去往敵國和親贫堰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容