iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果
一、需求
实现imageView的缩放旋转效果,一般有两种方式:
1、底层加scrollview,利用scrollview的属性实现。(推荐这种,这是我比较后发现的,手势做缩放旋转会有点弊端)
2、利用手势,捏合手势、旋转手势等。
这里我测试的第二种:手势实现,记录一下。
二、问题描述
一般手势处理后,对imageView进行transform处理,但我发现,每次获取手势再处理时,都会覆盖上一次的transform,从而达不到连续手势处理的效果。
比如:
我先放大一倍,再用手势放大,会发现图片会先回到原位,再放大,没有在第一次的放大位置基础继续方法,这不是我想要的。
三、解决方法
找了很多资料,发现可以用 CATransform3DGetAffineTransform 方法解决,这个系统方法的意思是获取之前的transform位置。
那么,我可以每次手势结束后,先记录下此时的transform,下次再处理时,在这个transform基础上再继续处理,就可以了。
核心代码如下:
1、定义一个全局变量,用于记录每次的tarnsform
var lastTranform3D:CATransform3D?
2、缩放、旋转:先获取上次的transform,再继续处理本次的transform
imageView.transform = CATransform3DGetAffineTransform(lastTranform3D!).scaledBy(x: sender.scale, y: sender.scale)
imageView.transform = CATransform3DGetAffineTransform(lastTranform3D!).rotated(by: sender.rotation)
全部代码:实现图片的缩放旋转等。
/// 添加手势
func setImageGesture() { //缩放手势
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.handlePinchGesture(sender:)))
imageView.addGestureRecognizer(pinch) //双击手势,还原大小
let doubletap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleDoubletapGesture(sender:)))
doubletap.numberOfTapsRequired =
imageView.addGestureRecognizer(doubletap) // 旋转手势
let rotation = UIRotationGestureRecognizer(target: self, action: #selector(self.handleRotationGesture(sender:)))
imageView.addGestureRecognizer(rotation)
}
/// 处理缩放手势
///
/// - Parameter sender: <#sender description#>
func handlePinchGesture(sender:UIPinchGestureRecognizer) {
if sender.state == UIGestureRecognizerState.began || sender.state == UIGestureRecognizerState.changed {
if lastTranform3D == nil {
imageView.transform = CGAffineTransform(scaleX: sender.scale, y: sender.scale)
}else{ imageView.transform = CATransform3DGetAffineTransform(lastTranform3D!).scaledBy(x: sender.scale, y: sender.scale)
} }else if sender.state == UIGestureRecognizerState.ended{
lastTranform3D = imageView.layer.transform } }
/// 还原图片
///
/// - Parameter sender: <#sender description#>
func handleDoubletapGesture(sender:UITapGestureRecognizer) {
imageView.transform = CGAffineTransform.identity
lastTranform3D = nil
}
/// 处理旋转手势
///
/// - Parameter sender: <#sender description#>
func handleRotationGesture(sender:UIRotationGestureRecognizer) {
if sender.state == UIGestureRecognizerState.began || sender.state == UIGestureRecognizerState.changed {
if lastTranform3D == nil {
imageView.transform = CGAffineTransform(rotationAngle: sender.rotation)
}else{ imageView.transform = CATransform3DGetAffineTransform(lastTranform3D!).rotated(by: sender.rotation)
}
}else if sender.state == UIGestureRecognizerState.ended{
lastTranform3D = imageView.layer.transform
} }
iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果的更多相关文章
- iOS开发 CGAffineTransform 让图片旋转, 旋转后获得图片旋转的角度
1.让图片旋转 UIImageView *imageView = [[UIImageView alloc]init]; imageView.frame = CGRectMake(50, 50, 200 ...
- 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...
- jQuery旋转插件jqueryrotate 图片旋转
"jquery.rotate.min.js"是jQuery旋转rotate插件,支持Internet Explorer 6.0+ .Firefox 2.0 .Safari 3 .O ...
- 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- ios手机竖屏拍照图片旋转90°问题解决方法
手机拍照会给图片添加一个Orientaion信息(即拍照方向),如下: 用ios手机拍照,系统会给图片加上一个方向的属性, ios相机默认的拍照方向是后摄Home键在右为正,前摄Home键在左为正. ...
- 利用exif.js解决手机上传竖拍照片旋转90\180\270度问题
原文:https://blog.csdn.net/linlzk/article/details/48652635/ html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针 ...
- 修正ios h5上传图时的图片方向问题
.ios上传会在exif中带一个 Orientation的属性,这个属性在windows中不会生效,在ios浏览器中会生效,造成图片在windows资源管理器中与ios浏览器中方向不一致 为了用户 ...
- js实现图片旋转、模板文件查看图片大图之记录篇[二]
一个小小的前端需求送给大家,使用js实现图片旋转,并且点击图片能够实现规定格式的大图. 主要使用的是jQuery的delegate()方法实现图片旋转,该方法主要的功能就是给某个组件绑定一个或一组事件 ...
- flex 图片旋转(解决公转和自转问题)
在Flex中图片的旋转是既有公转和自转的.这样在图片旋转的时候就有一定小麻烦: 为了更好地说明问题,先引入两个概念:“自转”和“公转”.想象一下,地球在绕着太阳公转的同时,它自己也在自转.Flash应 ...
随机推荐
- Visio中方向键不能移动物件而是滚动画布
不知怎么的, 我的Visio中按方向键不能移动目标对象, 效果却是移动整个画布. 上网查了一下, 找到了原因. 因为不知怎么的错按了键盘上的Scroll Lock键, 再按一下就好了. 参考资 ...
- Max Points on a Line leetcode java
题目: Given n points on a 2D plane, find the maximum number of points that lie on the same straight li ...
- 【Javascript设计模式1】-单例模式
<parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...
- 关于如何使用javascript监听滚动条滚动事件
在网页中,通常有一个通往网页顶部的锚点,现在我们就来实现它 Html代码: <a id="scrollup" href="#top" style=&quo ...
- ML、DL相关资源
1. http://x-algo.cn/index.php/category/nlp/
- TSQL:判断某较短字符串在较长字符串中出现的次数。
给定一个较短字符串shortStr='ab',和一个较长字符串longStr='adkdabkwelabwkereabrsdweo2342ablk234lksdfsdf1abe': 判断shortSt ...
- ASP入门(八)-Request对象
Request是ASP的耳朵,它可以获得客户端传递来的消息. BinaryRead方法和TotalBytes属性 用于以二进制方式读取客户端的请求,比如处理通过客户端上传文件时,通常使用这个方法来读取 ...
- windows下根据进程ID强制杀死进程
[windows 进程ID PID]NTSD命令详解 1. ntsd -c q -p PID 2. ntsd -c q -pn ImageName 比如:ntsd -c q -pn qq.exe -c ...
- NVIDIA安装显卡提示你必须先安装Intel怎么办
无法安装驱动程序 计算机管理中查看当前的Intel的显卡驱动是否已经安装成功,如果显示的是标准VGA,则没有安装驱动,先要把Intel的显卡驱动装好(有时候360驱动大师这种工具并不能自动帮你装好 ...
- android中使用WebView请求网页
请求网页首先需要访问网络的权限,在AndroidManifest.xml添加如下内容: <uses-permission android:name="android.permissio ...