一、需求

实现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 = 2imageView.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.identitylastTranform3D = 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}}

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

  1. 解决ionic在手机上拍照图片旋转的问题

    解决ionic在手机上拍照图片旋转的问题 拍照或者从相册中选择图片,上传到服务器后,图片的方向是不对的 无论是拍照,还是从相册中选择图片都是可用的. correctOrientation:trueco ...

  2. 数据增强方法:图片镜像、图片缩放、图片旋转、加噪点

    1.图片镜像 //rotate with mirror #include <iostream> #include <opencv2/opencv.hpp> using name ...

  3. openc 图片旋转 ;OpenCvSharp 图片旋转

    openc 图片旋转 :OpenCvSharp 图片旋转 OpenCvSharp 版本 4.2.0 角度旋转核心代码: /// <summary>/// 旋转图片任意角度/// </ ...

  4. iOS开发 CGAffineTransform 让图片旋转, 旋转后获得图片旋转的角度

    1.让图片旋转 UIImageView *imageView = [[UIImageView alloc]init]; imageView.frame = CGRectMake(50, 50, 200 ...

  5. java 实现图片旋转_java实现图片旋转

    方法一:普通方法实现图片旋转 /** * 图像旋转 * @param src * @param angel * @return */ public static BufferedImage Rotat ...

  6. java 图片旋转_Java实现图片旋转、指定图像大小和水平翻转|chu

    本文实例为大家分享了Java实现图片旋转.指定图像大小.水平翻转,供大家参考,具体内容如下 package com.zeph.j2se.image; import java.awt.Graphics2 ...

  7. android图片双指缩放,Android图片双指缩放,单指移动实现

    Android 实现,图片双指缩放,单指移动.通过自定义ImageView控件实现. ZoomDragImageView.java代码如下: public class SwZoomDragImageV ...

  8. 解决三星手机拍照后,图片旋转。

    <span style="font-size:18px;">最近项目中遇到用三星手机拍照,图片会自动旋转,应该是三星内部系统的功能,然后需要是不让他旋转,找到了方法. ...

  9. qt 加载 图片旋转_QT 实现图片旋转的两种方法

    第一种方案 使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下: QMatrix matrix; matrix.rota ...

最新文章

  1. MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK
  2. python下载大文件-python-Django:允许用户下载大文件
  3. Mac连接路由器后没有反应_无线WiFi无法连接到网络怎么办【解决方法】
  4. maven依赖循环引用_shiro+spring boot+mybatis启动循环引用问题解决思路和方案
  5. IP、TCP、UDP数据包长度问题
  6. 三网融合情况下,实时语音通信技术的研究
  7. 基于 HTML5 WebGL 的 3D 渲染引擎构建工厂运作系统
  8. Ubuntu / Debian / Deepin等 Sublime Text 3 配置C++环境(一键编译运行,格式化代码)
  9. 【420天】跃迁之路——程序员高效学习方法论探索系列(实验阶段177-2018.04.01)...
  10. qqmail的文件中转站可真好用啊
  11. k2p刷机丢失eeprom_刷机经验分享,K2P无线路由器救砖必备,无线和MAC恢复窍门
  12. HTTP性能测试工具siege
  13. iOS 10 消息推送(UserNotifications)秘籍总结(一)
  14. 看看人家那公众号管理系统,那叫一个优雅(附源码)
  15. gromacs 安装_gromacs cpu版安装
  16. U盘 如何自定义U盘图标并彻底隐藏配置文件
  17. 5G语音回落4G解决方案-EPS Fallback IPLOOK
  18. 如何禁止ie打开本地网页文件时的安全提示
  19. 【综合类型第 28 篇】ReSharper 的安装、使用教程
  20. 基于STM32的智能家居控制系统设计与实现(带红外遥控控制空调)

热门文章

  1. 【前沿科技】看完这篇文章前,你绝对想象不到欧美航空机器人竟然发展到这个程度了!...
  2. 拍下首张黑洞照片的团队获300万美元奖金:2020年科学突破奖揭晓
  3. 国家计划统筹布局哪些人工智能创新平台?
  4. 中国AI企业吸金旺但90%亏损 今年将迎倒闭潮
  5. 2018五大人工智能趋势,你知道多少?
  6. 王劲首度解析景驰:我们是跑得最快的无人驾驶公司
  7. 漫画 | 辞职前与老板的最后一次谈话有哪些禁忌?
  8. “社区之星”成长故事征集
  9. 46 岁美国华裔“鞋王”意外去世,25 岁创业成亿万富翁
  10. 面试官问我:什么是高并发下的请求合并?