iOS 柱狀圖一種實現(xiàn)思路

對于iOS柱狀圖窿祥,不是有什么難度的效果株憾,gayhub上也有很多優(yōu)秀的第三方庫,比如AAChartKit晒衩、XYPieChart嗤瞎、PNChartCharts等好多听系,不過這些類庫大多封裝的太厲害了贝奇,如果你的項目只是單純的幾個柱狀圖、那么使用這些庫其實挺費勁的(學(xué)習(xí)成本+項目大锌渴ぁ)掉瞳,下面說說我的思路。

iOS繪圖以及圖形處理主要使用的是Core Graphics/QuartZ 2D浪漠,這也是大部分人寫柱狀圖的方法陕习,即使用UIBezierPath配合Core Graphics實現(xiàn)。我的思路是使用UICollectionView址愿,不過使用UICollectionView實現(xiàn)柱狀圖衡查,最好需求能滿足以下二點:

  • 1.柱狀圖的柱子夠?qū)挘詈糜悬c擊需求
  • 2.柱狀圖的柱子比較多必盖,需要滑動,這個更能體現(xiàn)出Cell復(fù)用

當然俱饿,也并不是一定要滿足上面2點歌粥,接下來用幾個小Demo演示一下(注:Demo是Objective-C實現(xiàn))

DemoA
DemoA預(yù)覽圖.gif

這個是基本的效果,使用UICollectionViewFlowLayout布局拍埠,將scrollDirection設(shè)置為UICollectionViewScrollDirectionHorizontal失驶;每個cell內(nèi)部有個綠色的UIView,根據(jù)數(shù)值調(diào)整這個綠色UIView的高度枣购,就是圖上的效果了嬉探,其實核心就是UICollectionViewFlowLayout,后面幾個Demo也全是基于此棉圈。

UICollectionViewFlowLayout *fw = [[UICollectionViewFlowLayout alloc] init];
fw.scrollDirection = UICollectionViewScrollDirectionHorizontal;
fw.minimumLineSpacing = 10;
fw.minimumInteritemSpacing = 0;
fw.itemSize = CGSizeMake(220, 30);
fw.headerReferenceSize = CGSizeMake(10, 220);
fw.footerReferenceSize = CGSizeMake(10, 220);
DemoB
DemoB效果圖.gif

這個效果是加了橫坐標值和漸變Cell涩堤,每個柱狀圖重新出現(xiàn)屏幕上時,會動畫出現(xiàn)分瘾,需要注意的是胎围,漸變使用的是CAGradientLayer,但是對含有CAGradientLayer的view使用frame動畫,會造成漸變的卡頓和動畫的不流暢白魂,所以這里是使用CAGradientLayer生成一張漸變圖汽纤,設(shè)置成柱狀圖柱子的背景即可。

DemoC
DemoC效果圖.gif

這個效果是始終以中間的Cell為基準顯示福荸,點擊其他Cell也會自動滾到中心蕴坪。因為UICollectionView繼承于UIScrollView,所以實現(xiàn)這種效果敬锐,關(guān)鍵在于兩個代理方法:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset;

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

具體的原理背传,可以查看這篇優(yōu)秀的文章:UIScrollView 實踐經(jīng)驗

DemoD
DemoD效果圖.gif

這個效果的目的是:有的需求是柱狀圖比較密集,當手指滑動時又要求可以顯示出對應(yīng)柱子的值滞造。其實實現(xiàn)起來很簡單续室,就是使用touchesBegan:withEvent:以及touchesMoved:withEvent:等幾個方法即可。

DemoE
DemoE效果圖.gif

這個是有柱狀圖的同時谒养,還有曲線圖挺狰,實現(xiàn)方法是在UICollectionView上面加了一個透明的UIView,同時通過此UIViewhitTest:withEvent:方法买窟,將事件給到UICollectionView丰泊,再通過UICollectionView的代理方法,獲取界面上的Cell始绍,繪制曲線到UIView上瞳购。需要注意的是,UICollectionViewvisibleCells方法亏推,獲取到的Cell学赛,順序不是界面上的順序,需要排序之后再使用吞杭。

其實通過UIViewhitTest:withEvent:方法盏浇,能做很多神奇的事情,大家可以自行研究芽狗。

DemoF
DemoF效果圖@2x.png

這個沒啥绢掰,就是說明如果有復(fù)雜的坐標,也是可以實現(xiàn)的童擎,這個Demo的做法是在UICollectionView下面有一個UIView專門繪制坐標系滴劲。

DemoG
DemoG效果圖.png

這個其實跟柱狀圖沒有關(guān)系,大家都知道顾复,安卓的刷新和iOS不一樣班挖,下拉刷新分為侵入式非侵入式,對于iOS而言捕透,由于UIScrollViewBounce效果聪姿,所以使用侵入式下拉刷新碴萧,成了最好的選擇,但是iOS能否實現(xiàn)安卓那樣的非侵入式刷新呢末购?于是本Demo就簡單研究了一下破喻,目前是存在bug的,樣式也粗糙盟榴,不過思路應(yīng)該沒有問題曹质,提供給大家,可以研究研究:

1. 添加 UITableView
2. 在TableView上覆蓋一個無背景色的UIScrollView
3. 覆寫UIScrollView的幾個touchesBegan擎场、touchesEnded等幾個方法羽德,使其點擊事件傳遞到TableView
4. 在UIScrollView的代理方法scrollViewDidScroll里處理
4.1 scrollView.contentOffset.y小于0,處理刷新動畫和刷新邏輯
4.2 scrollView.contentOffset.y大于0迅办,同步設(shè)置TableView的contentOffset 來保持滾動一致
5. 應(yīng)該始終讓scrollView和TableView的contentSize保持一致

至此宅静,本文就沒了,其實本文沒啥技術(shù)含量站欺,說白就是UICollectionView的使用姨夹,不過主要目的是給大家提供思路,具體需求還得具體分析矾策。
本文Demo地址:GitHub

END磷账。
我是小侯爺。
在帝都艱苦奮斗贾虽,白天是上班族逃糟,晚上是知識服務(wù)工作者。
如果讀完覺得有收獲的話蓬豁,記得關(guān)注和點贊哦绰咽。
非要打賞的話,我也是不會拒絕的地粪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剃诅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驶忌,更是在濱河造成了極大的恐慌,老刑警劉巖笑跛,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件付魔,死亡現(xiàn)場離奇詭異,居然都是意外死亡飞蹂,警方通過查閱死者的電腦和手機几苍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陈哑,“玉大人妻坝,你說我怎么就攤上這事伸眶。” “怎么了刽宪?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵厘贼,是天一觀的道長。 經(jīng)常有香客問我圣拄,道長嘴秸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任庇谆,我火速辦了婚禮岳掐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饭耳。我一直安慰自己串述,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布寞肖。 她就那樣靜靜地躺著纲酗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逝淹。 梳的紋絲不亂的頭發(fā)上耕姊,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音栅葡,去河邊找鬼茉兰。 笑死,一個胖子當著我的面吹牛欣簇,可吹牛的內(nèi)容都是我干的规脸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熊咽,長吁一口氣:“原來是場噩夢啊……” “哼莫鸭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起横殴,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤被因,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衫仑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梨与,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年文狱,在試婚紗的時候發(fā)現(xiàn)自己被綠了粥鞋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞄崇,死狀恐怖呻粹,靈堂內(nèi)的尸體忽然破棺而出壕曼,到底是詐尸還是另有隱情,我是刑警寧澤等浊,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布腮郊,位于F島的核電站,受9級特大地震影響凿掂,放射性物質(zhì)發(fā)生泄漏伴榔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一庄萎、第九天 我趴在偏房一處隱蔽的房頂上張望踪少。 院中可真熱鬧,春花似錦糠涛、人聲如沸援奢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽集漾。三九已至,卻和暖如春砸脊,著一層夾襖步出監(jiān)牢的瞬間具篇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工凌埂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驱显,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓瞳抓,卻偏偏與公主長得像埃疫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子孩哑,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫栓霜、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,101評論 4 62
  • 01 今天刷微博時看到一條消息:一個媽媽喂自己的孩子吃飯鹰霍,孩子估計是不想吃了就到處亂跑,手里還拿著筷子茵乱。孩子在前面...
    油條姑娘閱讀 271評論 0 1
  • 產(chǎn)品經(jīng)理總會因為各種各樣的需求與他人發(fā)生爭論,但更多時候我們發(fā)現(xiàn)對話經(jīng)常以沒有任何理由的“反正這個功能沒必要做”結(jié)...
    木心逸閱讀 3,525評論 0 12
  • 「回頭」 男妓白X涉黑鵲孟岛、信友情向 2. - 一千萬瓶竭。 這什么概念督勺? 這也就意味著至少一個月李白不用再回這地下俱樂...
    鶴一樓閱讀 718評論 0 3
  • 在老家休息時智哀,看到書桌上有一本被擱置的書籍《美人何處》,簡潔的封面荧恍,看上去十分的淡雅瓷叫,想畢書的內(nèi)容也是清新...
    不二ch閱讀 98評論 0 0