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
            }
    
        }
  • 相关阅读:
    【Dart学习】-- Dart之匿名方法 & 回调函数 & 闭包
    【Dart学习】-- Dart之异常处理
    【Dart学习】-- Dart之操作符
    【Dart学习】-- Dart之注释
    【dart学习】-- Dart之元数据
    【Dart学习】-- Dart之泛型
    利用Aspose文档转图片
    结合仓库设计MVC控制器
    分享一个点赞超过100的漂亮ASP.NET MVC蓝色界面框架
    开发日记:接口开发设计
  • 原文地址:https://www.cnblogs.com/yajunLi/p/6747692.html
Copyright © 2011-2022 走看看