iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果
2017-04-22 14:01
633 查看
一、需求
实现imageView的缩放旋转效果,一般有两种方式:
1、底层加scrollview,利用scrollview的属性实现。(推荐这种,这是我比较后发现的,手势做缩放旋转会有点弊端)
2、利用手势,捏合手势、旋转手势等。
这里我测试的第二种:手势实现,记录一下。
二、问题描述
一般手势处理后,对imageView进行transform处理,但我发现,每次获取手势再处理时,都会覆盖上一次的transform,从而达不到连续手势处理的效果。
比如:
我先放大一倍,再用手势放大,会发现图片会先回到原位,再放大,没有在第一次的放大位置基础继续方法,这不是我想要的。
三、解决方法
找了很多资料,发现可以用 CATransform3DGetAffineTransform 方法解决,这个系统方法的意思是获取之前的transform位置。
那么,我可以每次手势结束后,先记录下此时的transform,下次再处理时,在这个transform基础上再继续处理,就可以了。
核心代码如下:
1、定义一个全局变量,用于记录每次的tarnsform
2、缩放、旋转:先获取上次的transform,再继续处理本次的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 = 2 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用三个手势和仿射变换实现图片的旋转缩放移动效果(类iBooks教科书)
- iOS---transform类的使用,平移,缩放,旋转效果的实现
- 使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果
- iOS 利用平移缩放旋转手势对view实现对应的平移缩放旋转效果(一)
- iOS tableView顶部图片下拉缩放效果实现
- 使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果
- CSS3 transform实现图片旋转木马3D浏览效果
- IOS 图片 移动 缩放 旋转 transform属性
- css3-transform-matrix 即矩阵实现物体旋转、缩放、移动效果
- 讲解一下iOS图片单指旋转缩放实现方法
- Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控旋转,圆角矩形,圆形和仿刮刮卡效果
- iOS 已经 实现 单指 旋转 缩放 位移 等操作,Transform的应用
- 猫猫学IOS(九)UI之UIScrollView代理触摸实现_图片缩放
- IOS第18天(4,核心动画,时钟效果,定时器,图片旋转角度,CALayer 锚点,获取当前,小时,秒,分)
- 用户上传图片后实现图片预览效果(解决fakepath路径问题)
- android仿IOS按钮点击效果,一张图片实现
- IOS 图片折叠效果实现
- IOS 实现类似桌面删除应用程序的效果(长按 可编辑 删除 图片按比例截取)
- iOS项目开发实战——使用CALayer实现图片的淡入淡出效果
- IOS进阶之Accelebrate.framework 实现图片模糊效果