iOS 柱状图一种实现思路

对于iOS柱状图,不是有什么难度的效果,gayhub上也有很多优秀的第三方库,比如AAChartKitXYPieChartPNChartCharts等好多,不过这些类库大多封装的太厉害了,如果你的项目只是单纯的几个柱状图、那么使用这些库其实挺费劲的(学习成本+项目大小),下面说说我的思路。

iOS绘图以及图形处理主要使用的是Core Graphics/QuartZ 2D,这也是大部分人写柱状图的方法,即使用UIBezierPath配合Core Graphics实现。我的思路是使用UICollectionView,不过使用UICollectionView实现柱状图,最好需求能满足以下二点:

  • 1.柱状图的柱子够宽,最好有点击需求
  • 2.柱状图的柱子比较多,需要滑动,这个更能体现出Cell复用

当然,也并不是一定要满足上面2点,接下来用几个小Demo演示一下(注:Demo是Objective-C实现)

DemoA
DemoA预览图.gif

这个是基本的效果,使用UICollectionViewFlowLayout布局,将scrollDirection设置为UICollectionViewScrollDirectionHorizontal;每个cell内部有个绿色的UIView,根据数值调整这个绿色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,每个柱状图重新出现屏幕上时,会动画出现,需要注意的是,渐变使用的是CAGradientLayer,但是对含有CAGradientLayer的view使用frame动画,会造成渐变的卡顿和动画的不流畅,所以这里是使用CAGradientLayer生成一张渐变图,设置成柱状图柱子的背景即可。

DemoC
DemoC效果图.gif

这个效果是始终以中间的Cell为基准显示,点击其他Cell也会自动滚到中心。因为UICollectionView继承于UIScrollView,所以实现这种效果,关键在于两个代理方法:

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

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

具体的原理,可以查看这篇优秀的文章:UIScrollView 实践经验

DemoD
DemoD效果图.gif

这个效果的目的是:有的需求是柱状图比较密集,当手指滑动时又要求可以显示出对应柱子的值。其实实现起来很简单,就是使用touchesBegan:withEvent:以及touchesMoved:withEvent:等几个方法即可。

DemoE
DemoE效果图.gif

这个是有柱状图的同时,还有曲线图,实现方法是在UICollectionView上面加了一个透明的UIView,同时通过此UIViewhitTest:withEvent:方法,将事件给到UICollectionView,再通过UICollectionView的代理方法,获取界面上的Cell,绘制曲线到UIView上。需要注意的是,UICollectionViewvisibleCells方法,获取到的Cell,顺序不是界面上的顺序,需要排序之后再使用。

其实通过UIViewhitTest:withEvent:方法,能做很多神奇的事情,大家可以自行研究。

DemoF
DemoF效果图@2x.png

这个没啥,就是说明如果有复杂的坐标,也是可以实现的,这个Demo的做法是在UICollectionView下面有一个UIView专门绘制坐标系。

DemoG
DemoG效果图.png

这个其实跟柱状图没有关系,大家都知道,安卓的刷新和iOS不一样,下拉刷新分为侵入式非侵入式,对于iOS而言,由于UIScrollViewBounce效果,所以使用侵入式下拉刷新,成了最好的选择,但是iOS能否实现安卓那样的非侵入式刷新呢?于是本Demo就简单研究了一下,目前是存在bug的,样式也粗糙,不过思路应该没有问题,提供给大家,可以研究研究:

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,同步设置TableView的contentOffset 来保持滚动一致
5. 应该始终让scrollView和TableView的contentSize保持一致

至此,本文就没了,其实本文没啥技术含量,说白就是UICollectionView的使用,不过主要目的是给大家提供思路,具体需求还得具体分析。
本文Demo地址:GitHub

END。
我是小侯爷。
在帝都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
如果读完觉得有收获的话,记得关注和点赞哦。
非要打赏的话,我也是不会拒绝的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 01 今天刷微博时看到一条消息:一个妈妈喂自己的孩子吃饭,孩子估计是不想吃了就到处乱跑,手里还拿着筷子。孩子在前面...
    油条姑娘阅读 266评论 0 1
  • 产品经理总会因为各种各样的需求与他人发生争论,但更多时候我们发现对话经常以没有任何理由的“反正这个功能没必要做”结...
    木心逸阅读 3,496评论 0 12
  • 「回头」 男妓白X涉黑鹊、信友情向 2. - 一千万。 这什么概念? 这也就意味着至少一个月李白不用再回这地下俱乐...
    鹤一楼阅读 706评论 0 3
  • 在老家休息时,看到书桌上有一本被搁置的书籍《美人何处》,简洁的封面,看上去十分的淡雅,想毕书的内容也是清新...
    不二ch阅读 91评论 0 0