您的位置:首页 > 移动开发 > IOS开发

iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果

2017-04-22 14:01 633 查看
一、需求

实现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
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐