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 = 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
        }

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM