文档章节

iOS坐标系的转换

xiaobai1315
 xiaobai1315
发布于 2017/02/08 10:18
字数 734
阅读 21
收藏 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
博文 203
码字总数 63303
作品 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
iOS的绘图机制-iOS,iPad,iPhone,Objective-c

嘿!我又回来了。 在前面我介绍了iOS的视图机制,我也提到了iOS的视图框框可以通过drawRect自己绘图,我也说过每个view的layer(CALayer)就像一个视图的投影,其实我们也可以来操作它定制一...

晨曦之光
2012/05/28
2.9K
0
【Cocos2d-x-基础概念】坐标系统

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

王选易
2013/05/21
0
0
苹果发布第一个 Android 应用,支持切换到 iOS 9

苹果发布了第一个 Android 应用。这并不是一个 Android 版本的 Safari 或者是其他的,而是一个用来简化切换到 iOS 过程的工具。Move to iOS 应用会吸引很多想使用 iPhone 6s/iPhone 6s Plus...

oschina
2015/09/17
10.6K
49

没有更多内容

加载失败,请刷新页面

加载更多

springboot jpa 访问数据库

spring boot(五):spring data jpa的使用 SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql

颖辉小居
19分钟前
3
0
Quartz + Oracle 分布式Job实现

简述 实现 依赖包 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.3</version><exclusions><exclusion><groupId>com.zax......

呼呼南风
24分钟前
5
0
崛起于Springboot2.X之集成规则引擎Drools(41)

1、创建Springboot项目,勾选Web模块和lombok插件 2、添加pom其他依赖 <dependency> <groupId>org.kie</groupId> <artifactId>kie-spring</artifactId> <version>7.11.0.Fin......

木九天
32分钟前
5
0
Kylin修改context-path方法

Kylin修改context-path比较麻烦,本身kylin是前后端分离的工程,修改不是只改war,还得改前端路径 步骤如下: 1、tomcat webapps 修改 kylin.war 修改成test.war 2、vi test.war 从index.htm...

litterMo
33分钟前
2
0
怎样使用Chrome浏览器截取整个网页?

1、打开控制台:Ctrl + Shift + I 2、命令执行:Ctrl + Shift + P 3、Capture full size screenshot 浏览器会自动下载截图图片,推荐过几个扩展功能: 1.全屏幕截取网页编辑共享神器-Awesom...

近在咫尺远在天涯
36分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部