最近因为项目需求,需要将部分显示在平板上的信息以A4纸的形式打印出来,期间经历颇多。
一开始的打算是将已有的纸版拍成照片,然后将这个照片作为背景图片,然后把相关的信息标签以label的形势加在上面。这个方法尝试了一下,对于恨死恨死的模板来说还是很好有,虽然约束有些麻烦,但是在后面的一些方法中还是比较好用的,怎奈模板的数据不固定,还有一部分是可变的,虽然是极少的一步,但是终究不满足需求。
第二种方法就是用XML文件,实现类似网络的填表格式,这方面需要足够能力的HTML5的知识,小弟不才,只知道此法可行,暂时无法尝试。
第三种就是利用xib,画好视图,然后通过模型赋值,将生成的图片截图,发送到到打印机就可打印出来了。
现在就第三种方法详细谈一下期间曲折。整个过程都是使用经典的MVC模式,开始制作一个基础的模板,里面只有一张表格,表格内容的条数有模型赋值,约束的时候注意一下,别写死,根据内容再适当的调整一下高度即可,这里要说到就是关于分页的问,内容多了指定要分页,前面说了只有一张表是可变的,说以分页也不算太难,再画一个xib单独放个tableview加上一个页脚,也没什么太难的(这里主要是有个会xib妹子,能力极强,让我学到了不少)。
没有不变的需求,由于需要出四个版本,内容大致一样但是难度节节攀升,你面可变的表单逐渐变多,还得考虑分页的情况,由于内容是可变的,有很大的变化,期间没有找到相关的资料,经验也相对少走了不少弯路,但最后看来对xib中的控件的使用更加熟练尤其是约束这块。在这里只谈两点,一、逻辑思维,在分页这块要根据内容来进行分页,每页的数据都不一样,程序员懒是通病,不想写太多重复的代码,一是很low即使复制粘贴页很麻烦,有一个变量没改,就出不了结果,所有做之前一定要有大体的思路来面对分页和约束的这两个主要问题。二、约束,一开始查了A4的宽高大概是7:10 ,由于有几张表是可变的高度不敢写死,但后面约束起来相当麻烦,做后还是果断的写死了,反正iOS有runtime的特点,很多内容都是可以在赋值的时候改变的,先写死约束好然后在赋值时在根据内容做修改即可。
总结
- NSLayoutConstraint *chargeViewConstraintH 属性和frame是不一样的,要改高度最好通过xib中的约束来改,改变frame不起作用。
- [otherPrinteView layoutIfNeeded];这个会重绘xib,不然xib控件的关系会有点乱的。
- -(UIimage) imageWithUIView:(UIView) view的方法来进行截图。
- 三目表达式还是很好用的 (a>b)?a:b;的判断还是很好用的。