文档章节

iOS坐标系的转换

xiaobai1315
 xiaobai1315
发布于 2017/02/08 10:18
字数 734
阅读 14
收藏 0

测试过程中遇到的问题:

测试时是在ViewDidLoad方法中转换坐标系的,

    CGRect newRect = [self.redView convertRect:self.redView.bounds toView:nil];

使用这句代码时,转换出来的坐标系是错误的,原因是toView设置为nil,  convertRect方法会以keyWindow作为坐标系,在ViewDidLoad方法调用时,keyWindow是没有frame的,导致转换的坐标系是错误的;

 

 

test1.png

什么是坐标系的转换?

不同坐标系,控件的View的frame值是不同的,比如上图的红色View,以蓝色控件为父控件作为坐标系原点,那么它的frame的x = 50,y = 50;如果红色View以控制器的View为坐标系的原点,那么它的frame的x = 100 + 50,y = 100 + 50;
如果两个View进行比较,比如是否包含,是否交叉重叠,那么应该转换成同一坐标系,这样才可以直接比较;

1.同一坐标系View1和View2之间比较

  • 比如都是以控制器的View为父控件,以控制器的View的坐标原点作为参照点
    // rect1是否包含rect2,必须是同一个坐标系,返回值是bool
     CGRectContainsRect(rect1, rect2)
    // 是否有交叉,必须是同一个坐标系,返回值是bool
     CGRectIntersectsRect(rect1, rect2)
    // 这个点是否在这个矩形框内,返回值是bool
     CGRectContainsPoint(rect1, point)
  • 注意:同一坐标系两个View之间比较,rect是控件的frame,不是它的bound

2.不同坐标系View1和View2之间比较

首先了解两个重要的方法:

view2坐标系 : 以view2的左上角为坐标原点
view1坐标系 : 以view1的左上角为坐标原点

// 显然这里rect不是View的frame,而是bound 
// 让rect这个矩形框, 从view2坐标系转换到view1坐标系, 得出一个新的矩形框newRect
// rect和view2的含义 : 用来确定矩形框原来在哪
CGRect newRect = [view1 convertRect:rect fromView:view2];

// 让rect这个矩形框, 从view1坐标系转换到view2坐标系, 得出一个新的矩形框newRect
// rect和view1的含义 :用来确定矩形框原来在哪
CGRect newRect = [view1 convertRect:rect toView:view2];

1.确定redView在window中的位置和尺寸

// 这里用`CGRect newRect = [view1 convertRect:rect toView:view2];;
`,这个方法演示

// 方法一:
CGRect newRect = [self.redView convertRect:self.redView.bounds toView:[UIApplication sharedApplication].keyWindow];

// 方法二:
CGRect newRect = [self.redView.superview convertRect:self.redView.frame toView:[UIApplication sharedApplication].keyWindow];

// 方法三:
// 在这里 [UIApplication sharedApplication].keyWindow == nil;
CGRect newRect = [self.redView convertRect:self.redView.bounds toView:nil];

2.确定blueView在window中的位置和尺寸

// 这里用`CGRect newRect2 = [view1 convertRect:rect fromView:view2];
`,这个方法演示

// 注意这里` [[UIApplication sharedApplication].keyWindow`不能写nil
CGRect newRect = [[UIApplication sharedApplication].keyWindow convertRect:self.blueView.bounds fromView:self.blueView];

3.判断两个rect是否有交叉重叠

NSLog(@"%zd", CGRectIntersectsRect(newRect, newRect2));

3.1判断newRect是否包含newRect2

NSLog(@"%zd", CGRectContainsRect(newRect, newRect2));

3.封装代码,判断两个View是否有重叠

- (BOOL)intersectWithView:(UIView *)view
{
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    CGRect selfRect = [self convertRect:self.bounds toView:window];
    CGRect viewRect = [view convertRect:view.bounds toView:window];
    return CGRectIntersectsRect(selfRect, viewRect);
}

本文转载自:http://www.jianshu.com/p/c59b32be2dfb

共有 人打赏支持
xiaobai1315
粉丝 3
博文 199
码字总数 60377
作品 0
程序员
iOS 实现输入框跟随键盘自动上移

场景还原 有些时候在包含输入框的页面中,点击输入框输入会因键盘弹起而遮挡住一部分输入框,影响用户体验。iOS在默认情况下并不会处理这种问题,不过我们可以自己实现键盘弹起输入框自动上移...

还是不够辣
2017/04/12
0
0
iOS--OC--图片拉伸和尺寸变换,图片简单处理

图片拉伸和尺寸变换 图片拉伸 : - (UIImage )stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight; 一般 leftCapWidth = imageWidth .5f, top......

丶雨凡
2015/03/26
0
0
【Cocos2d-x-基础概念】坐标系统

Cocos2d-x-基础概念-坐标系统 不同坐标系的介绍 笛卡尔坐标系 UI坐标系 在ios、安卓、wp一般的UI坐标布局中 原点是在左上角 x从左到右递增 y从顶到底递增 像这样 Direct3d DirectX中采取了笛...

王选易
2013/05/21
0
0
CoreText 实现图文混排

NSTextView和Attribued String 第一次接触苹果系的富文本编程是在写Mac平台上的一个输入框的时候,输入框中的文字可以设置各种样式,并可以在文字中间插入图片,好在Mac的AppKit中提供了NST...

Megan_zhou
2014/05/26
0
0
[C++][IO]fstream用法

fstream用法 1. 打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: void open(const char* filename,int mode,int access); 参数: filename:  要打开的文件...

guitar_zp
2011/08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 Windows 中以服务方式自动重启的原因

针对长时间使用的 Confluence,我们推荐你配置 Confluence 自动随操作系统重启而启动。针对一些 Windows 的服务器,这意味着需要让 Confluence 以服务的方式运行。 有下面 2 种方式来以服务的...

honeymose
52分钟前
2
0
day93-20180920-英语流利阅读-待学习

时尚之觞:外表光鲜靓丽,其实穷得要命 Lala 2018-09-20 1.今日导读 讲到时尚界,我们脑海里浮现的可能都是模特和设计师光鲜靓丽、从容潇洒的模样。可是,最近在法国出版的一本书却颠覆了我们...

飞鱼说编程
今天
4
0
maven的pom.xml用解决版本问题

maven管理库依赖,有个好处就是连同库的依赖的全部jar文件一起下载,免去手工添加的麻烦,但同时也带来了同一个jar会被下载了不同版本的问题,好在pom的配置里面允许用<exclusion>来排除一些...

JAVA码猿
今天
2
0
20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
550
19

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部