ios开发之坐标系转换

1:坐标系转换最核心的问题就是:比较两个坐标是否包含,或者是重叠等,最主要的问题是先将两个坐标转换到同一个坐标系下再去比较。第一步先确定矩形框在某个view坐标系下的frame(该矩形框是以该view的左上角为坐标原点)2:再转换到另一个view坐标系下(转换后的坐标依然是以另一个view的坐标原点来计算得出新坐标系下的矩形框)

2:坐标系的转化方法:1:CGRectContainsRect(<#CGRect rect1#>, <#CGRect rect2#>),判断rect1矩形框是否包含rect2矩形框  2:CGRectIntersectsRect(<#CGRect rect1#>, <#CGRect rect2#>):判断rect1的矩形框是否和rect2的矩形框重叠 3:

CGRectContainsPoint(<#CGRect rect#>, <#CGPoint point#>) ,判断某个点是否包含在矩形框内,4:以上三个方法的使用前提是都要在同一个坐标系下来判断,若不是在同一个坐标系下,利用坐标系转换转到同一个坐标系下,在进行比较。

#import "ViewController.h"

@interface ViewController ()
/** 蓝色 */
@property (nonatomic, weak) UIView *blueView;
/** 橙色 */
@property (nonatomic, weak) UIView *orangeView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIView *blueView = [[UIView alloc] init];
    blueView.backgroundColor = [UIColor blueColor];
    blueView.frame = CGRectMake(50, 50, 100, 100);
    blueView.alpha = 0.5;
    [self.view addSubview:blueView];
    self.blueView = blueView;

    UIView *orangeView = [[UIView alloc] init];
    orangeView.backgroundColor = [UIColor orangeColor];
    orangeView.frame = CGRectMake(100, 100, 100, 100);
    orangeView.alpha = 0.5;
    [self.view addSubview:orangeView];
    self.orangeView = orangeView;

    // CGRectContainsRect(<#CGRect rect1#>, <#CGRect rect2#>)
    // CGRectIntersectsRect(<#CGRect rect1#>, <#CGRect rect2#>)
    //CGRectContainsPoint(<#CGRect rect#>, <#CGPoint point#>)
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // self.blueView.bounds = {0, 0, 100, 100}
    // self.orangeView.bounds = {0, 0, 100, 100}

    // self.blueView.frame = {50, 50, 100, 100}
    // self.orangeView.frame = {200, 200, 100, 100}

    NSLog(@"%zd", CGRectIntersectsRect(self.blueView.frame, self.orangeView.frame));
}

@end

总结:1:上部分代码两个view是在同一个坐标系下,都是以屏幕左上角为坐标原点,所以调用方法可以判断两个view是否是包含关系或是重叠关系  2:注意点:在touchBeagn方法的打印中,判断两个view是否是重叠关系,传入两个view的rect值,注意此时的rect值不能传入bounds,只能传入frame,因为两者需要在同一个坐标系下作比较,两者的父控件都是self.view,所以两者的frame都是以父控件的坐标原点计算的frame,而bounds确是以自身控件的原点计算的frame。所以用bounds两者根本不在同一个坐标下,所以只能传入frame

3:坐标系的相互转换:不同坐标系转换到同一个坐标系下,进行比较:其中最核心的关键点是:1:要将不同坐标下的矩形框转换到统一坐标系下进行比较  2:第一步先要确定出矩形框在原坐标系下的frame,只有确定了矩形框在原来坐标系下的位置,才能准确转换到另一个坐标系中得到新的rect值   3:可以调用方法from,或是to方法进行坐标系的转换[view1 convertRect:rect fromView:view2];[view1 convertRect:rect toView:view2];其中无论是新转换的rect还是待转换的rect,都是以view1或是view2的左上角为坐标原点计算的

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

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

CGRect newRect = [view1 convertRect:rect fromView:view2];

让rect这个矩形框, 从view2坐标系转换到view1坐标系, 得出一个新的矩形框newRect

rect和view2的含义 : 用来确定矩形框原来在哪

CGRect newRect = [view1 convertRect:rect toView:view2];

让rect这个矩形框, 从view1坐标系转换到view2坐标系, 得出一个新的矩形框newRect

rect和view1的含义 :用来确定矩形框原来在哪

#import "ViewController3.h"

@interface ViewController3 ()
@property (weak, nonatomic) IBOutlet UIView *blueView;
@property (weak, nonatomic) IBOutlet UIView *redView;
@end

@implementation ViewController3

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//    view2坐标系 : 以view2的左上角为坐标原点
//    view1坐标系 : 以view1的左上角为坐标原点
//
//    CGRect newRect = [view1 convertRect:rect fromView:view2];
//    让rect这个矩形框, 从view2坐标系转换到view1坐标系, 得出一个新的矩形框newRect
//    rect和view2的含义 : 用来确定矩形框原来在哪
//
//    CGRect newRect = [view1 convertRect:rect toView:view2];
//    让rect这个矩形框, 从view1坐标系转换到view2坐标系, 得出一个新的矩形框newRect
//    rect和view1的含义 :用来确定矩形框原来在哪

    // 确定redView在window中的位置和尺寸
//    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];
    CGRect newRect = [self.redView convertRect:self.redView.bounds toView:nil];
//    CGRect newRect = [self.redView.superview convertRect:self.redView.frame toView:nil];
//    CGRect newRect = [[UIApplication sharedApplication].keyWindow convertRect:self.redView.bounds fromView:self.redView];
//    CGRect newRect = [[UIApplication sharedApplication].keyWindow convertRect:self.redView.frame fromView:self.redView.superview];
    NSLog(@"%@", NSStringFromCGRect(newRect));
}

@end

总结:1:坐标系的换换用to方法:1:当利用此方法做坐标系的转换时,toView的参数传空值nil的时候,默认为当前的主窗口。2:当做不同坐标系的相互转换的时候,利用bounds和frame都可以,主要是通过bounds或是frame来确定待矩形框在原view的位置,还要是确定了位置就可以实现不同坐标系下的转换。bounds是以自身view为坐标原点来确定矩形框的位置,传入的参数为自身的view和bounds,而frame是以其父控件的左上角为坐标原点,传入的参数为父控件的view和矩形框的frame。3:要想拿到某个控件的父控件,就是superView,self.redView.superview

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

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

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

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

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

4:判断在不同坐标下的两个矩形框是否包含关系或者是否是重叠关系:1:首先将两个处在不同坐标系下的矩形框转换到同一个坐标系在 2:在调用包含,重叠的方法,会返回一个Bool类型的返回值,来判断两个矩形框的关系

#import "ViewController2.h"

@interface ViewController2 ()
@property (weak, nonatomic) IBOutlet UIView *greenView;
@property (weak, nonatomic) IBOutlet UIView *whiteView;
@end

@implementation ViewController2

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // CGPoint point = [self.whiteView convertPoint:CGPointMake(50, 50) fromView:self.greenView];
    // NSLog(@"%@", NSStringFromCGPoint(point));

    CGRect whiteRect = [self.whiteView convertRect:self.whiteView.bounds toView:nil];
    CGRect greenRect = [self.greenView convertRect:self.greenView.bounds toView:nil];

    NSLog(@"greenView - %@", NSStringFromCGRect(greenRect));
    NSLog(@"whiteView - %@", NSStringFromCGRect(whiteRect));
    NSLog(@"%zd", CGRectIntersectsRect(greenRect, whiteRect));

}

- (void)test
{

    NSLog(@"greenView - %@", NSStringFromCGRect(self.greenView.frame));
    NSLog(@"whiteView - %@", NSStringFromCGRect(self.whiteView.frame));

    // greenView - {{10, 10}, {80, 80}}

    // whiteView - {{150, 150}, {80, 80}}

    NSLog(@"%zd", CGRectIntersectsRect(self.greenView.frame, self.whiteView.frame));
}

@end
时间: 2024-11-12 17:57:32

ios开发之坐标系转换的相关文章

iOS开发时间戳与时间NSDate,时区的转换,汉字与UTF8,16进制的转换

http://blog.sina.com.cn/s/blog_68661bd80101njdo.html 标签: ios时间戳 ios开发时间戳 ios16进制转中文 ios开发utf8转中文 ios汉字转utf8和16进   //获取当前系统的时间戳+(long)getTimeSp{    long time;    NSDate *fromdate=[NSDate date];    time=(long)[fromdate timeIntervalSince1970];    return

(原)Android到IOS开发的转换(一)

序)闲扯几句 很早就想入手ios开发,但是一直没有机会,个人没有水果机器,上个公司上班的那台mac mini虽然就在我身边,灰都有一层了,但是一直没有机会开机学习下,因为事多,自上一篇文章后,离职后,新公司给配备了mac pro,正好满足了自己都心愿,开始水果软件开发.自己也是从0开始,学习它不过就这3-4天而已,但是之前对oc还是有些了解,因此凭着android的感觉去做,移动端嘛,不都是布局上丢组件,我相信也有人如果从android走到ios也会有这样的思想吧,我的思路是: 先翻翻ios的结

NX二次开发-UFUN CSYS坐标系转换UF_CSYS_map_point

1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_curve.h> 5 #include <uf_csys.h> 6 #include <uf_mtx.h> 7 8 9 UF_initialize(); 10 11 //创建向量方向 12 double Vec[3] = { 10.0, 23.5, 75.8 }; 13 14 //3*3矩阵,输入Z向量,得到矩阵 15 double Mtx[9]; 16 UF_M

iOS开发系列--绘图与滤镜全面解析

概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图形绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框架就是Quartz 2D,Quartz 2D是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎.Quartz 2D在UI

iOS开发基础知识--碎片3

iOS开发基础知识--碎片3  iOS开发基础知识--碎片3 十二:判断设备 //设备名称 return [UIDevice currentDevice].name; //设备型号,只可得到是何设备,无法得到是第几代设备 return [UIDevice currentDevice].model; //系统版本型号,如iPhone OS return [UIDevice currentDevice].systemVersion; //系统版本名称,如6.1.3 return [UIDevice

iOS开发系列--打造自己的“美图秀秀”

http://www.cnblogs.com/kenshincui/p/3959951.html#overview --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框

iOS开发——UI篇&amp;文字渐变效果:图层中的mask属性

文字渐变效果:图层中的mask属性 本次文章,主要讲述的是图层中的mask属性,利用它,可以做出文字渐变效果! 一.文字渐变效果: 二.文字渐变实现思路: 1.创建一个颜色渐变层,渐变图层跟文字控件一样大. 2.用文字图层裁剪渐变层,只保留文字部分,就会让渐变层只保留有文字的部分,相当于间接让渐变层显示文字,我们看到的其实是被裁剪过后,渐变层的部分内容. 注意:如果用文字图层裁剪渐变层,文字图层就不在拥有显示功能,这个图层就被弄来裁剪了,不会显示,在下面代码中也会有说明. 2.1 创建一个带有文

iOS开发——图形编程OC篇&amp;(一)Quartz 2D介绍

Quartz 2D介绍 一.什么是Quartz2D Quartz 2D是?个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,??有各种各样的UI控件 UILabel:显?文字 UIImageView:显示图片 UIButton:同时显示图片和?字

斯坦福IOS开发第五课(第二部分)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/27845257 作者:小马 五 代码示例 上面讲到的知识点在这个示例都有涉及.另外我这里也只是分析部分重要的代码,更多的知识了解请自行下载代码(文章最下面有地址)并结合公开课一起看. 新建一个single view的工程,然后新增一个视图类,叫FaceView,如下图所示: 然后我们在storyboard里拖进来一个通用的视图控件,作为上面那个视图类对应的视图,如下图所示: