获取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都没有触摸输入. ...
随机推荐
- 前端使用 Konva 实现可视化设计器(7)- 导入导出、上一步、下一步
请大家动动小手,给我一个免费的 Star 吧~ 这一章实现导入导出为JSON文件.另存为图片.上一步.下一步. github源码 gitee源码 示例地址 导出为JSON文件 提取需要导出的内容 ge ...
- Region-区域
定义Region的方式有两种: 一种是在XAML定义 RegionManager.RegionName(XAML) 一.View代码 1 <Viewbox Grid.Column="1 ...
- dotnet OpenXML 读取 PPT 内嵌 xlsx 格式 Excel 表格的信息
在 Office 中,可以在 PPT 里面插入表格,插入表格有好多不同的方法,对应 OpenXML 文档存储的更多不同的方式.本文来介绍如何读取 PPT 内嵌 xlsx 格式的表格的方法 读取方法和 ...
- WPF dotnet core 的 Blend SDK Behaviors 库
之前版本是通过安装 Blend SDK 支持 Behaviors 库的,但是这个方法都是通过引用 dll 的方式,不够优雅.在升级到 dotnet core 3.0 的时候就需要使用 WPF 官方团队 ...
- LVGL 字体
一.LVGL 内置字体 LVGL有几种不同大小的内置字体,可以通过 LV_FONT_MONTSERRAT_X 定义在 lv_conf.h 中启用. 普通字体 包含所有ASCII字符,度数符号(U + ...
- ubuntu_24.04 Noble LTS安装docker desktop启动无窗口及引擎启动失败的解决方法
ubuntu_24.04 LTS安装docker desktop启动无窗口及引擎启动失败的解决方法 1. 安装docker desktop后启动无窗口 现象: 执行sudo apt install . ...
- Failed to download metadata for repo ‘PowerTools‘: Cannot prepare internal mirrorlist: No URLs in mi
Failed to download metadata for repo 'AppStream' [CentOS] - Techglimpsehttps://techglimpse.com/faile ...
- centos7桌面版安装百度网盘
百度网盘官网下载Linux版本的软件 CentOS7的软件包格式为rpm # 安装依赖 yum -y install libXScrnSaver yum -y install libstdc++.so ...
- 纯JS实现多张图片无缝滚动和多张图片上下滚动的效果--JavaScript实例集锦(初学)
我们会看到很多的网站上会使用多张图片无缝滚动的效果. 下面我就介绍几种纯JS实现多张图片的无缝滚动,并实现鼠标移到图片上运动停止的效果,可以控制图片左右滚动.1.效果展示: 代码实现: <!DO ...
- Linux(三):Linux的目录及相关作用
使用 Linux,不仅限于学习各种命令,了解整个 Linux 文件系统的目录结构以及各个目录的功能同样至关重要.使用 Linux 时,通过命令行输入 ls -l / 可以看到,在 Linux 根目录( ...