获取ImageView的触摸点所对应的UIImage的坐标
获取ImageView的触摸点所对应的UIImage的坐标
功能描述
在imageview上触摸图片,求对应UIImage的触摸点。
实现前分析
从imageview上获取触摸点是比较容易的事情,但是由于imageview的大小、比例的关系,获得的触摸点不能直接被认为是UIImage上的点。在这里将会根据大小、比例对触摸点进行操作,以期望得到对应的UIImage的点。

(蓝色区域为imageview的区域,当我触摸红点时可以轻易的获取该点在imageview上的坐标(71.666656,120.000000),然而这并不代表该点在UIImage的坐标也是如此)
注意事项
在实践过程中发现如果view出现了旋转的时候,这个时候坐标系会出现旋转,圆心在图片左上角,而view的大小会出现变化,这个时候依照view的大小比例来进行缩放结果将会出现问题(如图所示)。

代码
- (CGPoint)getTouchPointOnImageWithImageView:(UIImageView *)imageView
touchPoint:(CGPoint)ivTouchPoint {
//only support UIViewContentModeScaleAspectFit
if (!imageView ||
!imageView.image ||
imageView.contentMode != UIViewContentModeScaleAspectFit) {
return CGPointZero;
}
//避免被旋转后的原imageview给干扰
UIImageView *tempIv = [[UIImageView alloc]initWithImage:imageView.image];
tempIv.transform = imageView.transform;
tempIv.bounds = imageView.bounds;
//旋转回去
arg = atan(tempIv.transform.b / tempIv.transform.a);
tempIv.transform = CGAffineTransformRotate(tempIv.transform, -arg);
CGPoint imgTouchPoint = ivTouchPoint;
BOOL widthHasEmpty = tempIv.image.size.height * tempIv.frame.size.width > tempIv.image.size.width * tempIv.frame.size.height;
BOOL heightHasEmpty = tempIv.image.size.height * tempIv.frame.size.width < tempIv.image.size.width * tempIv.frame.size.height;
CGFloat H, h;
if (heightHasEmpty) {
H = tempIv.image.size.height * tempIv.frame.size.width / tempIv.image.size.width;
h = (tempIv.frame.size.height - H) / 2;
} else {
H = tempIv.frame.size.height;
h = 0;
}
if (heightHasEmpty) {
imgTouchPoint.y -= h;
}
CGFloat W,w;
if (widthHasEmpty) {
W = tempIv.image.size.width * tempIv.frame.size.height / tempIv.image.size.height;
w = (tempIv.frame.size.width - W) / 2;
} else {
W = tempIv.frame.size.width;
w = 0;
}
if (widthHasEmpty) {
imgTouchPoint.x -= w;
}
if (!CGRectContainsPoint(CGRectMake(0, 0, tempIv.image.size.width, tempIv.image.size.height), imgTouchPoint)) {
NSLog(@"touch point is out of range");
return CGPointZero;
}
return imgTouchPoint;
}
求打赏

获取ImageView的触摸点所对应的UIImage的坐标的更多相关文章
- 如何获取imageView中当前内容的相关信息并比较?
public class MainActivity extends Activity implements OnClickListener{ private Button button; privat ...
- android——获取ImageView上面显示的图片bitmap对象
获取的函数方法为:Bitmap bitmap=imageView.getDrawingCache(); 但是如果只是这样写我们得到的bitmap对象可能为null值,正确的方式为: imageView ...
- js获取移动端触摸坐标
想在touchmove事件里监听手指按下的坐标,event.pageX获取的是undefined,changedTouches,targetTouches,touches也只获得到了鼠标按下时的坐标, ...
- Android获取ImageView上的图片,和一个有可能遇到的问题!
1.在获取图片前先调用setDrawingCacheEnabled(true)这个方法: 举例:mImageView.setDrawingCacheEnabled(true); 2.之后可以通过get ...
- Android 获取imageview的图,在另一个imageview里显示。
当我点击默认头像里的其中一个然后在点确定就在最上面的那个imageview里显示选择的头像.求大神. img1和img2都是ImageView,要把img1中的图片显示到img2中 前景(对应src属 ...
- 获取imageView的图和背景图
img1和img2都是ImageView,要把img1中的图片显示到img2中 前景(对应src属性) img2.setImageDrawable(img1.getDrawable()); 背景(对应 ...
- Touchmove获取当前触摸的Dom节点
原文链接:https://www.jianshu.com/p/a2a41fe20790 Touchmove获取当前触摸的Dom节点 近期为自己的app增加一个通讯录首字母导航的功能,如下图蓝色框部分, ...
- Android中的ImageView的getDrawableCache获取背景图片的时候注意的问题
获取ImageView的背景图片使用getDrawableCache方法,不要使用getDrawable方法,后者获取不到图片的. 1.在调用imageView.getDrawableCache()之 ...
- iOS学习笔记--触摸事件
最近空闲时间在学习iOS相关知识,几周没有更新文章了,今天总结下这些天的学习内容,也整理下iOS的学习笔记,以便以后查阅翻看- iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件 响 ...
- 移动端-js触摸事件
开发者工具 在移动开发中,一种较为容易的做法是,先在桌面上开始原型设计,然后再在打算要支持的设备上处理移动特有的部分.多点触摸正是难以在PC上进行测试的那些功能之一,因为大部分的PC都没有触摸输入. ...
随机推荐
- VisualStudio 禁用移动文件到文件夹自动修改命名空间功能
在 VisualStudio 2022 里的某个版本开始,将会在移动文件到其他文件夹时,自动修改命名空间,使用匹配文件夹路径的命名空间.如果这个功能能顺手将其他引用此类型的全部符号同时变更,那自然是很 ...
- 模型微调-书生浦语大模型实战营学习笔记4&大语言模型7
大语言模型-7.模型微调 书生浦语大模型实战营学习笔记-4.模型微调 本节对应的视频教程为B站链接.笔记对视频的理论部分进行了整理.部分内容参考李宏毅2024春<生成式人工智能导论>和三分 ...
- 抛砖系列之文本处理工具-awk
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯.彼得·温伯格和布莱恩·柯林汉姓氏的首个字母 ...
- SpringBoot 利用Timer 在指定时间2小时后执行任务
/** * @Description * @Author songwp * @Date 2022/8/5 12:51 * @Version 1.0.0 **/ @Component public cl ...
- vue3创建工程
创建 Vue3 项目的步骤如下: 安装 Node.js Vue3 需要依赖 Node.js 环境,因此需要先安装 Node.js.可以从官网下载 Node.js 的安装包并安装,也可以使用包管理器安装 ...
- 效率工具mysoV0.3.0功能介绍
也许大家在日常工作中,有使用过提升效率的工具,比如快速搜索文件的Everything:火柴:Listary等,这些工具都在一定程度上提升您的工作效率.myso作为后来者,跟上述软件一样,也是为提升 ...
- HTTP 连接详解
概述 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的,客户端可以打开一条TCP/IP连接,连接到任何地方的服务器.一旦连接建立,客户端和服务器之间交换的报文就永远不会丢失.受损或失序 T ...
- 鸿蒙HarmonyOS实战-Stage模型(ExtensionAbility组件)
一.ExtensionAbility组件 1.概念 HarmonyOS中的ExtensionAbility组件是一种能够扩展系统功能的能力组件.它可以通过扩展系统能力接口,为应用程序提供一些特定的功能 ...
- Windows10 在Hyper-V安装lnmp环境docker方式
1.启用win10虚拟化hyper-v 2.安装docker win10 https://hub.docker.com/editions/community/docker-ce-desktop-win ...
- salesforce零基础学习(一百三十七)零碎知识点小总结(九)
本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_lab_conditional_visibiliy_tab.ht ...