公司項(xiàng)目中的新需求中有個(gè)統(tǒng)計(jì)圖標(biāo)的模塊,就參考別人的代碼自己琢磨修改了下煮甥,效果圖如下:
Y軸值是5等分的盗温,X軸的值個(gè)數(shù)理論上是無(wú)限的
定義
定義很簡(jiǎn)單:就定義了一個(gè)類?MineAgencyChartView
定義了幾個(gè)title的屬性以及x軸的數(shù)據(jù)數(shù)組成肘、值的數(shù)據(jù)數(shù)組 一個(gè)切換圖表數(shù)據(jù)的api?
外部調(diào)用
賦值幾個(gè)屬性值肌访,再調(diào)用?-(void)reDraw; 即可;
實(shí)現(xiàn)
說(shuō)明一下:布局是用的Masnory艇劫,代碼中也有很多自己定義的宏
幾個(gè)titleLabel、scorllerView的布局:
主要實(shí)現(xiàn)是在?-(void)reDraw惩激;中
考慮到會(huì)有數(shù)據(jù)切換的情況店煞,所以把subViews和subLayers都給清理了,
NSInteger maxValue = [[self.valueArr valueForKeyPath:@"@max.integerValue"] integerValue]; //取出最大值
? ? NSInteger y_maxValue = (maxValue%10) ? ((maxValue/10 + 1) * 10) : maxValue; // 換算出y軸中的最大值
這里是通過(guò)值數(shù)據(jù)风钻,拿出最大值顷蟀,再把最大值取到 10 的整數(shù)。下面畫Y軸的時(shí)候把這個(gè)值5等分骡技,我這么做只是為了Y軸頂部數(shù)據(jù)好看點(diǎn)鸣个。僅供參考(并且這么做的話就沒(méi)必要定義Y軸的數(shù)據(jù)數(shù)組了,靈活變化)布朦。
這里遍歷x軸數(shù)組數(shù)據(jù)囤萤,畫豎線,這里畫線的話用的是UIView是趴,這里有點(diǎn)不好涛舍,本來(lái)是想用貝塞爾線來(lái)畫的,但是布局用的是Masnory唆途,F(xiàn)rame數(shù)據(jù)獲取不到富雅,也沒(méi)有用過(guò)Masnory畫貝塞爾線(不知道可不可以),所以就用UIView來(lái)替代了肛搬。創(chuàng)建底部label没佑,賦值數(shù)據(jù)。
Y軸5等分 “繪制-1” ?中換算出的y軸最大值温赔,畫線同上蛤奢,創(chuàng)建y軸label,賦值數(shù)據(jù)让腹。
遍歷值數(shù)組远剩,根據(jù)值和y軸最大值的比例,用Masonry于y軸底部橫線做約束骇窍,確定點(diǎn)的位置瓜晤,在點(diǎn)的上面用label標(biāo)出值。
[self layoutIfNeeded]; 這里得出點(diǎn)的frame. 用貝塞爾曲線連起來(lái)腹纳,配合基礎(chǔ)動(dòng)畫做一個(gè)串聯(lián)的動(dòng)畫效果痢掠。后面的代碼遮罩層動(dòng)畫同樣是基礎(chǔ)動(dòng)畫應(yīng)用驱犹,就不說(shuō)明了,感覺(jué)有點(diǎn)冗余了足画。
總結(jié)
這里記錄的話只是我的實(shí)現(xiàn)雄驹,只提供一個(gè)思路,供參考淹辞。方便以后自己查看医舆。
若有問(wèn)題請(qǐng)聯(lián)系我:
? ? 郵箱:13048914897@163.com