一、需求

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

iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果的更多相关文章

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

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

  2. 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待

    在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...

  3. jQuery旋转插件jqueryrotate 图片旋转

    "jquery.rotate.min.js"是jQuery旋转rotate插件,支持Internet Explorer 6.0+ .Firefox 2.0 .Safari 3 .O ...

  4. 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题

    html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...

  5. ios手机竖屏拍照图片旋转90°问题解决方法

    手机拍照会给图片添加一个Orientaion信息(即拍照方向),如下: 用ios手机拍照,系统会给图片加上一个方向的属性, ios相机默认的拍照方向是后摄Home键在右为正,前摄Home键在左为正. ...

  6. 利用exif.js解决手机上传竖拍照片旋转90\180\270度问题

    原文:https://blog.csdn.net/linlzk/article/details/48652635/ html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针 ...

  7. 修正ios h5上传图时的图片方向问题

     .ios上传会在exif中带一个 Orientation的属性,这个属性在windows中不会生效,在ios浏览器中会生效,造成图片在windows资源管理器中与ios浏览器中方向不一致  为了用户 ...

  8. js实现图片旋转、模板文件查看图片大图之记录篇[二]

    一个小小的前端需求送给大家,使用js实现图片旋转,并且点击图片能够实现规定格式的大图. 主要使用的是jQuery的delegate()方法实现图片旋转,该方法主要的功能就是给某个组件绑定一个或一组事件 ...

  9. flex 图片旋转(解决公转和自转问题)

    在Flex中图片的旋转是既有公转和自转的.这样在图片旋转的时候就有一定小麻烦: 为了更好地说明问题,先引入两个概念:“自转”和“公转”.想象一下,地球在绕着太阳公转的同时,它自己也在自转.Flash应 ...

随机推荐

  1. [leetcode]Multiply Strings @ Python

    原题地址:https://oj.leetcode.com/problems/multiply-strings/ 题意: Given two numbers represented as strings ...

  2. [PowerShell Utils] Automatically Change DNS and then Join Domain

    I would like to start a series of blog posts sharing PowerShell scripts to speed up our solution ope ...

  3. 自动化打包 Jenkins 持续集成 Git Gradle MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)在pom.xml中添加依赖: <properties> <shi ...

  5. jquery中对 iframe的操作

    我们先看一下 JQUERY中的对像 contents() 的帮助文件 contents() 概述 查找匹配元素内部所有的子节点(包括文本节点).如果元素是一个iframe,则查找文档内容 示例 描述: ...

  6. Linq-Contains查询

    customers.Where(c => c.Name.Contains("john"));

  7. 强化Linux安全的10个技能

    1.找出不必要的服务 很明显,服务器上跑的服务,并不是每个都有用的.强烈建议检查并关掉不需要的服务,从而减少风险(多跑一个服务,就可能多几个漏洞). 查询运行在runlevel 3的服务列表: [af ...

  8. TSQL:判断某较短字符串在较长字符串中出现的次数。

    给定一个较短字符串shortStr='ab',和一个较长字符串longStr='adkdabkwelabwkereabrsdweo2342ablk234lksdfsdf1abe': 判断shortSt ...

  9. 转: Centos安装gcc及g++

    Centos安装gcc及g++   Centos支持yum安装,安装软件一般格式为yum install .......,注意安装时要先成为root用户. 按照这个思路,我想安装过程如下: 安装gcc ...

  10. Node.js中针对中文的查找和替换无效的解决方法

    Node.js中针对中文的查找和替换无效的解决方法.   //tags的值: tag,测试,帖子 var pos1 = tags.indexOf("测"); //这里返回-1 ta ...