1、需求ide
實現imageView的縮放旋轉效果,通常有兩種方式:測試
一、底層加scrollview,利用scrollview的屬性實現。(推薦這種,這是我比較後發現的,手勢作縮放旋轉會有點弊端)ui
二、利用手勢,捏合手勢、旋轉手勢等。spa
這裏我測試的第二種:手勢實現,記錄一下。code
2、問題描述orm
通常手勢處理後,對imageView進行transform處理,但我發現,每次獲取手勢再處理時,都會覆蓋上一次的transform,從而達不到連續手勢處理的效果。blog
好比:圖片
我先放大一倍,再用手勢放大,會發現圖片會先回到原位,再放大,沒有在第一次的放大位置基礎繼續方法,這不是我想要的。ip
3、解決方法get
找了不少資料,發現能夠用 CATransform3DGetAffineTransform 方法解決,這個系統方法的意思是獲取以前的transform位置。
那麼,我能夠每次手勢結束後,先記錄下此時的transform,下次再處理時,在這個transform基礎上再繼續處理,就能夠了。
核心代碼以下:
一、定義一個全局變量,用於記錄每次的tarnsform
var lastTranform3D:CATransform3D?
二、縮放、旋轉:先獲取上次的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 } }