例子1

Controller的view中有一个tableView,tableView的cell上有一个button,现在需要将button的frame转为在Controller的view中的frame,怎么实现呢?

CGRect rect = [self.view convertRect:_button.frame fromView:_button.superview];
CGRect rect = [_button.superview convertRect:_button.frame toView:self.view];

注意1.

button的frame是相对于其superview来确定的,frame确定了button在其superview的位置和大小

注意2.

现在转换后,我们肉眼观察到的,所有屏幕上的控件的布局并不会改变,但是此时以上两个方法返回的frame代表着,button在self.view上的大小和位置

注意3.

这里应该使用的是_button.frame而不能是_button.bounds

注意4.

这里2个方法是可逆的,2个方法的区别就是消息的接收者和view参数颠倒

注意5.

这里_button虽然是在tableView上的,但是不能写toView的消息接收者不能是tableView,因为_button的superview并不是tableView

注意6.

注意理解消息的接收者,即第一行代码的self.view和第二行代码的_button.superview

一般来说,toView方法中,消息的接收者为被转换的frame所在的控件的superview;fromView方法中,消息的接收者为即将转到的目标view

注意7.

涉及的所有view的UIWindow必须是同一个对象!否则转换失败

例子2

现在需要将一个触摸事件的点screenPoint(触摸事件的点的坐标系是相对于当前的屏幕——UIWindow),转化为屏幕里某个tableView上的点。即我想知道,我现在触摸的屏幕位置,是在这个tableView的什么位置上

CGPoint tablePT = [_tableView convertPoint:screenPoint fromView:nil];

注意1.

当参数view为nil的时候,系统会自动帮你转换为当前窗口的基本坐标系(即view参数为整个屏幕,原点为(0,0),宽高是屏幕的宽高)

注意2.

当view不为nil的时候,消息的接收者和参数view都必须是在同一个UIWindow对象里

If view is nil, this method instead converts to window base coordinates. Otherwise, both view and the receiver must belong to the same UIWindow object.

例子3

responseDragbackAtScreenPoint方法用于判断是否响应横滑返回消息,screenPoint是触摸事件的点

现在tableView上的cell中有一个横滑列表(UIScrollView),现在需要判断触摸点是否在UIScrollView的区域上,再根据其他条件判断是否需要横滑返回

- (BOOL)responseDragbackAtScreenPoint:(CGPoint)screenPoint
{
//将当前触摸点转化为tableView上的点
CGPoint tablePT = [tableView convertPoint:screenPoint fromView:nil];
//根据tableView上的点定位到当前点的IndexPath
NSIndexPath *pathIndex = [tableView indexPathForRowAtPoint:tablePT];
//根据IndexPath找到当前触摸位置的cell
UITableViewCell *cell = [tableView cellForRowAtIndexPath:pathIndex]; //遍历该cell上的所有subView
NSArray *subViews = [cell.contentView subviews];
for (UIView *itemView in subViews)
{
//找打当前cell上的UIScrollView,目前业务上只有1个
if ([itemView isKindOfClass:[UIScrollView class]])
{
UIScrollView *itemScrollView = (UIScrollView *)itemView;
//将当前的scrollView的frame转为相对于整个屏幕上的frame
CGRect rc = [itemScrollView.superview convertRect:itemScrollView.frame toView:nil];
//因为screenPoint和rc是同一个坐标系下的,所以可以用来判断screenPoint是否在rc的区域内
//1.当scrollView的cell超过屏幕的时候 2.当触摸点在scrollView的区域上的时候 3.当不是以下情况:scrollView还未被滑动的时候手指在上面向右滑 1.2.3都满足的情况下才不响应横滑返回
if (itemScrollView.contentSize.width > itemScrollView.width &&
CGRectContainsPoint(rc, screenPoint) &&
!(itemScrollView.contentOffset.x == -itemScrollView.contentInset.left))
return NO;
}
}
return YES;
}

汇总

iOS中,常用的坐标转换和frame转换如下:

// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 将像素point从view中转换到当前视图中,返回在当前视图中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view; // 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view; // 将rect从view中转换到当前视图中,返回在当前视图中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;

UIView 坐标转换的更多相关文章

  1. iOS UIView中的坐标转换convertPoint --- iOS开发系列 ---项目中成长的知识六

    如果你的UITableViewCell里面有一个Button需要响应事件,你会怎么做? 在Controller中使用 button父类的父类?   例如:UITableViewCell *parent ...

  2. UIView中的坐标转换

    在使用 UITableViewCell 的frame属性获取origin得到的坐标是不变的. 也就是说如果UITableView初始化完毕后,每个cell的坐标是固定的,x不变,y 随index递增的 ...

  3. IOS-- UIView中的坐标转换

    // 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UI ...

  4. iOS中坐标转换

    坐标转换,可以用UIVIew的方法 //由要转换坐标view的superView执行该方法,rect为待转换view的frame,view是要显示到哪儿的 - (CGRect)convertRect: ...

  5. 你真的了解UIView吗?

    一:首先查看一下关于UIView的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIView : UIResponder <NSCoding, UIAppe ...

  6. UIView Programming Guide学习笔记

    |View |Creating and Configuring View Objects |Creating and Managing a View Hierarchy |Adjusting the ...

  7. UIView hitTest的原理

    [转自:http://blog.sina.com.cn/s/blog_59fb90df0101ab26.html] UIView 两个方法: - (UIView *)hitTest:(CGPoint) ...

  8. 【转】 UIView如何管理它的子视图

    原文:http://my.oschina.net/u/1984662/blog/293690 目录[-] Core Animation基础 改变视图的层 动画支持 视图坐标系统 边框.边界.和中心的关 ...

  9. iOS UIView非常用方法及属性详解

    在调用视图的 Quartz  调用都可以正确地在视图中描画.   视图对象通过 bounds .和 center  属 性声明来跟踪自己的大小和位置.frame 属性包含一个矩形,即边框矩形,用于指定 ...

随机推荐

  1. qq 自制表情包

      如何自制qq表情包? CreateTime--2018年2月5日15:34:35 Author:Marydon 1.添加表情 2.选择表情(可以进行多选) 3.对添加的表情进行分组 4.添加成功( ...

  2. 【Linux】rmdir命令

    用途 rmdir用于删除空目录 全称 rmdir的全称是:Remove Directory 参数 -p:连同上层空的目录一起删除 案例 现在有文件结构如下 test3 文件夹为空文件夹 test/te ...

  3. android系统特效详解和修改方法

    安卓系统特效相关文件:  存在于:framework-res.apk   反编译后的\framework-res\res\anim文件夹内!anim文件夹下所有的文件都是特效文件原理  反编译fram ...

  4. NPM 模块收集

    cross-env https://www.npmjs.com/package/cross-env 在package.json设置环境变量的时候,会有兼容性问题,如: { "scripts& ...

  5. Atitit.数据库事务隔离级别 attilax 总结

    Atitit.数据库事务隔离级别 1. 事务隔离级别的作用 1 2. 在的隔离级别 2 3. 常见数据库的默认管理级别 3 1. 事务隔离级别的作用 较低的隔离级别可以增强许多用户同时访问数据的能力, ...

  6. CentOS开机的时候卡在进度条一直进不去 F5(是关键)

    这看不出开机启动卡在哪里,只好重启按住"e"键,进入启动菜单: 然后移动到第二项kernel...接着按e进入编辑 去掉rhgb quiet字样 按回车保存回到选择项 按b启动它就 ...

  7. 时间同步linux和window

    windows和linux都可以通过ntp服务,同步时间.

  8. iOS中的动画(转载)

    iOS中的动画  最近两天没事在慢慢学习一些动画,好多东西长时间不用都给忘了,找到一篇介绍很详细的文章就粘贴了过来以备复习,原文地址:https://my.oschina.net/aofe/blog/ ...

  9. KMP算法完整教程 (上)

    KMP算法完整教程 全称: Knuth_Morris_Pratt Algorithm(KMP算法) 类型: 高级检索算法 功能: 字符串匹配查找 提出者: D.E.Knuth(克努兹),J.H.Mor ...

  10. 打开palette面板