用drawRect的方式实现了一个尺子选择器,demo在这里:https://github.com/Phelthas/LXMRulerView
效果如图:
 
如果不考虑复用的问题,我感觉最简单的实现方式其实是让美术做一张尺子的图片,放到scrollView上就可以了,
数值可以根据scrollview的contentOffset来计算。
如果考虑复用的问题,还是用代码写来的方便,封装一些属性,就可以实现很多不同的样式。所以就有了这个LXMRulerView~
 
实现方案:
目前用的是一个比较笨的实现方案,就是用drawRect的方式画了一个尺子,然后把这个view放到scrollview上,然后用scrollview的contentOffset来计算数值。
有看到资料说用drawRect的方式会比较占内存,用CALayer实现会好很多,这个我还没有试,但目前来看demo里面内存占用都很小,有空试一下layer的实现方式吧~
为什么说这个方案比较笨呢?因为这里面其实是完完全全画了一个完整的尺子,没有复用任何资源,所以理论上如果尺子很长很长的话,还是会很消耗内存的;
考虑到尺子也是不断重复的外观,只有数字不一样,所以理论上用一个横向的collectionView来实现会更好一些,这个有空实践一下看看效果怎么样吧~
 
 
需要注意的地方:
1,对autoLayout的支持和从xib初始化的支持
drawRect是按bounds来画图的,而且默认情况下drawRect方法只会调用一次。
所以如果从xib初始化,且初始化时的view大小与最终显示的view大小不同的话,drawRect是按最初初始化的大小来绘制的,不会随着autoLayout调整大小,
所以这里没有什么好的办法,只能在layoutSubview中手动调整改view的大小。
但仅仅调整view大小还不够,画好的图默认不会重新绘制,UIView有一个contentMode属性,需将其设置为UIViewContentModeRedraw,
效果是在view的bounds有变化时,会重新调用drawRect方法。
 
2,整数吸附效果
在scrollviewDidScroll的方法中调整contentOffset来使其停留在整数的位置上的方法太low了!!!会使动画效果看起来很不连贯
怎么解决呢?
就是用
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inoutCGPoint *)targetContentOffset
这个方法,这也是系统提供的delegate方法,所以可以放心用,效果就是可以让scrollview刚好停留在targetContentOffset的位置,所以只需要在这个方法中计算出指定的位置就可以了~
 
3,数值变化的回调
为了简单易用,数值变化的回调方法是用block的方式。
在用的时候,需要注意一下循环引用的问题,所以block中还是用weakSelf安全一点
 
4,为了保证滑动位置的准确度,尺子最大最小值和间距都只支持整型,不支持浮点数~~等想到好解决办法支持~
 
 

2016年9月28日更新
经测试发现,如果尺子比较长的话,用drawRect的方式确实占用了很大的内存,而且尺子越长,占用的内存越大,所以改用CALayer的方式实现,可以有效的减少内存;
加入了accuracy属性,表示一个刻度代表的值,比如accuracy为0.1,那么一个刻度表示0.1; 
 
目前还在持续更新中,有什么问题欢迎讨论~
 
 

用drawRect的方式实现一个尺子的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition(10-1)译->非Code Frist方式返回一个实体集合

    存储过程 存储过程一直存在于任何一种关系型数据库中,如微软的SQL Server.存储过程是包含在数据库中的一些代码,通常为数据执行一些操作,它能为数据密集型计算提高性能,也能执行一些为业务逻辑. 当 ...

  2. Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,相似图片浏览器

    MAC : XCode -> Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,类似图片浏览器 STEP1:将两个目录复制到project里面ImageBrowser ...

  3. DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表

    原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助 ...

  4. fopen()函数以"a+"方式打开一个不存在的文件后读写出现问题

    问题:在完成课后习题的时候,使用fopen()函数以"a+"方式打开一个不存在的文件时,写入.读取出现错误: //添加用户输入单词后,在单词头加入编号,确保编号跟着前面的开始排序 ...

  5. 使用闭包的方式实现一个累加函数 addNum

    使用闭包的方式实现一个累加函数 addNum,参数为 number 类型,每次返回的结果 = 上一次计算的值 + 传入的值,如: addNum(10); //10 addNum(12); //22 a ...

  6. C++->以读或写方式打开一个文件

    以读或写方式打开一个文件 #include<iostream.h>   //.h以C|非C标准引用库文件 #include<fstream.h> #include<std ...

  7. Spring框架——事务管理方式搭建一个小的项目

    学习Spring框架,通过事务管理的方式搭建一个小的项目,该项目可以查询对数据库中的图书库存数量进行修改. 首先,使用MVC分层的设计模式思想搭建项目目录结构. 此部分代码源码之中都有相关注释,所以尽 ...

  8. 继承TextView简单画一个尺子

    import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impor ...

  9. 亲手用模块化方式写一个jquery QQ表情插件。

    在回复或是评论的时候,很多时间都需要有回复表情的功能,然后而需要插入QQ表情可以是最常见的. 插件也写多很多个了,这次写插件就下了一个决定.就是使用模块化来开发. 最后在我的源代码中有这样子一段: v ...

随机推荐

  1. 为支持ASP.NET5跨平台,Jexus再添新举措

    Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...

  2. hadoop 笔记(zookeeper)

    1.安装 需要提前安装java环境,本文下载zookeeper-3.3.6.tar.gz包. 1.1 tar -zxvf zookeeper-3.3.6.tar.gz 1.2 修改conf中的zoo_ ...

  3. WCF : 如何将NetTcpBinding寄宿在IIS7上

    摘要 : 从IIS 7 开始, IIS增加了对非HTTP协议的支持. 因此, 自IIS 7之后, 可以将NetTcpBinding等非HTTP协议的Bindings直接寄宿在IIS上面. 本文将介绍如 ...

  4. HTML5之应用缓存---manifest---缓存使用----Web前端manifest缓存

    相信来查这一类问题的都是遇到问题或者是初学者吧! 没关系相信你认真看过之后就会知道明白的 这是HTML5新加的特性 HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连 ...

  5. CSS实现图片缩放特效

    今天是感恩节,祝大家感恩节快乐哦!最近天冷了,大家注意保暖哟.下面一起看看小颖写的demo吧. html代码: <!DOCTYPE html> <html> <head& ...

  6. ISO日期格式标准,浏览器到服务器到mysql中的时区

    时区简单理解 https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA 上面的链接是时区的wiki说明,下面说说我记住的部分: GMT时区是格林威治标准时间,我 ...

  7. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...

  8. Oracle 11.2.0.4单实例打PSU,OJVM PSU补丁快速参考

    写在前面: 1.Oracel打每个补丁的操作有时存在差异,所以不管多熟悉,都应该在打任何补丁之前阅读新补丁中附带的readme. 2.Oracle每季度都会更新一个最新的PSU,本文最新指的是当前最新 ...

  9. 打造android偷懒神器———ListView的万能适配器

    如果你去做任何一个项目,我相信你都会跟我有一样的经历,最最普遍的就是列表显示ListView,当然,写N个自定义的适配器也是情理之中.虽说程序员本身就是搬砖,做这些枯燥无味的重复的事情也是理所当然,但 ...

  10. CSS学习笔记——包含块 containing block

    以下内容翻译自CSS 2.1官方文档.网址:https://www.w3.org/TR/CSS2/visudet.html#strut 有时,一个元素的盒子的位置和尺寸根据一个确定的矩形计算,这个确定 ...