zoukankan      html  css  js  c++  java
  • 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
            }
    
        }
  • 相关阅读:
    20199327 2019-2020-2 《网络攻防实践》第二周作业
    20199327 2019-2020-2《网络攻防实践》第一周作业
    20199327 《网络攻防实践》假期作业
    笔记
    20199327《Linux内核原理与分析》第十二周作业
    20199327《Linux内核原理与分析》第十一周作业
    第二周 测试
    DOS攻击——ICMP报文洪水攻击
    阅读《供应链的可信溯源査询在区块链上的实现》总结 (硕士论文)��
    阅读《基于区块链和用户信用度的访问控制模型 》总结
  • 原文地址:https://www.cnblogs.com/yajunLi/p/6747692.html
Copyright © 2011-2022 走看看