一、需求
实现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 } }