最近公司做一个项目,需要对图片做旋转,缩放,拖动,以及拖边实现单边缩放.其实前边几个实现起来很简单,但是最后一个就不行了,当你单边缩放以后再旋转或缩放图片就会变形.刚开始在网上搜了很多都没有想要的结果,最后只能直接想办法解决了,最后还是解决了,在这里分享给大家.
首先做一些基本工作:定义全局变量
懒加载手势
把手势添加到图片上,不要忘了吧图片的交互打开
下面就是手势对应的代码
1.旋转手势 :这里面有一个很重要的点,一定是旋转-正常缩放-单边缩放的顺序,要不然就会变形,还有记录旋转角度一定要在正常缩放之前是因为缩放时候会导致旋转角度变Nan.
这里能贴出getRadianDegreeFromTransform方法
2.正常缩放:这里面的顺序也是:旋转-正常缩放-单边缩放;当然这里前面俩个顺序可以互换
3拖动和单边缩放放在一起了,这个地方才是重点也是难点,先上代码再解释
这就是拖动和单边缩放的所有代码,这里面说几个点:
1.setAnchorPoint这个是设置锚点,这个是为了让对边不动.
2.translationInView点击拖动的时候图片没有图片没有晃动
3.setDefaultAnchorPointforView手势操作完以后锚点复原
下面是setAnchorPoint和setDefaultAnchorPointforView相对应的方法
下面是相对应的单边缩放
这里我解释俩点:1.为什么要判断旋转角度,其实很简单,当我们旋转图片的时候,实际上作用力的坐标系是没有边的,举个例子:当旋转90度的时候,拉图片原始的上边的时候,力的方向在x轴上,这就造成y轴上只有很小的分量,这样直接效果就是拉不动.其中的奥妙自己多试试感受一下.2.关于单边缩放倍数的积累计算算法.这个我也是根据实际中的操作设计的,也不是很精确,在这里直说我的想法:因为啊,单边缩放是在原始的基础上乘以积累单边所放量得来的,那问题就来了,先看这两算法:举个例子:10*(1+0.1+0.1+0.1) = 13; 10*1.1*1.1*1.1 = 13.31;咱们想想一下如果原始图片很大时候这俩个方法相差就更大了,后一种方法就不可用了,手指轻轻一动,就放大了好多很吓人,反之也是一样.所以这里我把300作为了分水岭.
好了,就写这么多吧,这是我第一次写分享,写的不好请见谅,有什么不懂的或者想要源码的可以加我qq:963489848;