founcation中常用结构体
一、概述:
在foundation框架中,有一些关于位置和尺寸的结构体,在我们实际开发ios的时候会经常被使用到,所以这里详细讲解下:
NSRange : 表示范围
NSPoint\CGPoint:表示坐标
NSSize\CGSize:表尺寸
NSRect\CGRect :表示坐标和尺寸
二、使用讲解:
1、NSRange (范围,常常和NSString这个类一起使用)
(1)、初始化:
NSRange range = NSMakeRange(2, 4); // 表示从索引为2开始,长度为4这个范围
下面这两种方式,在开发中一般不会使用,了解下就可以:
NSRange r1 = {2, 4};//不用
NSRange r2 ={.location = 2, .length = 4};//不用
(2)、实际应用:
// 1》获取某个字符串的位置
NSString *str =@"ab cde fgh";
NSRange range = [str rangeOfString:@"cde"];//获取字符串“cde”在str中的范围
NSLog(@"location= %ld, length = %ld", range.location , range.length);
// 2》把NSRange,转换为NSString函数
NSString *str2 = NSStringFromRange(range);
NSLog(@"%@",str2);
(3)、注意点
// 注意,如果字符串不包含这个字符串,location =NSNotFound==-1,length=0
NSRange range2 = [str rangeOfString:@"java"];
NSLog(@"location= %ld, length = %ld", range2.location , range2.length);// NSNotFound,使用ld输出乱码
NSLog(@"NSNotFound= %d", NSNotFound);// 输出为-1
2、NSPoint\CGPoint、NSSize\CGSize、 NSRect\CGRect (一般都是用在iOS开发中,表示各个组件之间的关系,如包含、相交等)
(1)、初始化:(两种方式:(NSMakexxx\ CGXXXMake))
如:
CGPoint p1 = NSMakePoint(10, 10);// NSPoint p1 = NSMakePoint(10, 10);
CGPoint p2 = CGPointMake(10, 10);// NSPoint p2 = CGPointMake(10, 10); (常用)
NSLog(@"x = %f, y = %f", p1.x, p1.y);
NSSize s1 = NSMakeSize(100, 200);// CGSize s1 = NSMakeSize(100, 100);
NSSize s2 = CGSizeMake(100, 200);// CGSize s2 = CGSizeMake(100, 100);
NSLog(@"width = %f ,height = %f", s1.width, s1.height);
NSRect r1 = CGRectMake(50, 50, 100, 200);// CGRect r1 = CGRectMake(100, 100, 200, 200);
NSRect r2 = NSMakeRect(100, 100, 100, 200);// CGRect r2 = NSMakeRect(100, 100, 200, 200);
CGRect r3 ={{10,10},{10,10}}; // 还可以写成这种方式
NSLog(@"x = %f, y = %f, width = %f, height = %f", r1.origin.x, r1.origin.y, r1.size.width, r1.size.height);
(2)、实际应用:
// 1、结构体转换为字符串 (在oc中结构体不可以直接存储到NSArray等集合对象中,可以这样转换为字符串对象,然后存储)
NSString *str1 = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s1);
NSString *str3 = NSStringFromRect(r1);
NSLog(@"%@", str3);
// 2、原点、零尺寸、rect为0——》CGPointZero、CGRectZero、
CGPointZero; // 就表示CGPointMake(0, 0);即,原点
CGPointZero; // 表示 == {{0,0} ,{0,0}}
CGSizeZero; // 表示尺寸为0
// 3、常用函数(一般都是cg开头,长用在ios中组件是否相交等关系)
NSLog(@"---------------是否相等---------------------------");
BOOL isEqual = CGPointEqualToPoint(p1, p2);//点是否相同
NSLog(@"是否相等:%d", isEqual);
isEqual = CGSizeEqualToSize(s1, s2); // 判断尺寸是否相同
NSLog(@"是否相等:%d", isEqual);
isEqual = CGRectEqualToRect(r1, r2); // 判断坐标和尺寸是否相同
NSLog(@"是否相等:%d", isEqual);
NSLog(@"---------------包含判断---------------------------");
//CGRectContainsPoint,是否包含某个点,边线和边点都不成立,只要在内部的点才成立
BOOL isContain = CGRectContainsPoint(CGRectMake(0, 0, 10, 10), CGPointMake(10, 0));//判断某个坐标点p1,是否在某个rect之内(r1),这是点相交
NSLog(@"CGRectMake(0, 0, 10, 10), CGPointMake(10, 0)——》是否包含某个点:%d", isContain);
isContain = CGRectContainsPoint(CGRectMake(0, 0, 10, 10), CGPointMake(9.9 , 9.9));//判断某个坐标点p1,是否在某个rect之内(r1),在其内部
NSLog(@"CGRectMake(0, 0, 10, 10), CGPointMake(10, 10)——》是否包含某个点:%d", isContain);
NSLog(@"-------------------------rect是否包含rect:CGRectContainsRect------------------------");
//CGRectContainsRect 判断前一个rect,是否包含后一个rect,必须全部包含才可以,有一点超出都不行
BOOL flag = CGRectContainsRect(CGRectMake(0, 0, 10, 10), CGRectMake(10, 10, 10, 10));//判后一个是在前面一个的里面,只要点相交
NSLog(@"CGRectMake(0, 0, 10, 10), CGRectMake(10, 10, 10, 10) ——》是否包合:%d",flag);
flag = CGRectContainsRect(CGRectMake(0, 0, 10, 10), CGRectMake(5, 5, 6, 6)); // 超出,不成立
NSLog(@"CGRectMake(0, 0, 10, 10), CGRectMake(5, 5, 6, 6) ——》是否包合:%d",flag);
flag = CGRectContainsRect(CGRectMake(0, 0, 10, 10), CGRectMake(5, 5, 5, 5)); // 在里面,完全包含,成立
NSLog(@"CGRectMake(0, 0, 10, 10), CGRectMake(5, 5, 5, 5) ——》是否包合:%d",flag);
//判断两个rect是否有相交 ——》用于ios组件是否相交
NSLog(@"--------------------rect和rect是否相交---------------------------------------------");
// CGRectIntersection判断是否相交,并返回相交的部分,就算是一点相交都返回(如果不相交x和y为inf)
CGRect re = CGRectIntersection(CGRectMake(0, 0, 10, 10), CGRectMake(11, 11, 10, 10));//判断是否相交,如果把相交
NSLog(@"是否相交:x = %.1f,y = %.1f,width= %.1f, height= %.1f", re.origin.x, re.origin.y, re.size.width, re.size.height);
re = CGRectIntersection(CGRectMake(0, 0, 10, 10), CGRectMake(10, 10, 10, 10));//判断是否相交,就算有一点相交,都返回那个点,只是尺寸大小为0
NSLog(@"是否相交:x = %.1f,y = %.1f,width= %.1f, height= %.1f", re.origin.x, re.origin.y, re.size.width, re.size.height);
re = CGRectIntersection(CGRectMake(0, 0, 10, 10), CGRectMake(8, 8, 10, 10)); // 判断是否相交,如果相交返相交的部分的坐标和大小
NSLog(@"是否相交:x = %.1f,y = %.1f,width= %.1f, height = %.1f", re.origin.x, re.origin.y, re.size.width, re.size.height);
// CGRectIntersectsRect判断是否相交,如果相交就返回yes即1,边点和边线的相交都不成立,返回0
flag = CGRectIntersectsRect(CGRectMake(0, 0, 10, 10), CGRectMake(11, 11, 10, 10));
NSLog(@"CGRectMake(0, 0, 10, 10), CGRectMake(11, 11, 10, 10)-》是否相交:%d",flag);
flag = CGRectIntersectsRect(CGRectMake(0, 0, 10, 10), CGRectMake(10, 10, 10, 10));//只是有一点相交,不行
NSLog(@"CGRectMake(0, 0, 10, 10), CGRectMake(10, 10, 10, 10)-》是否相交:%d",flag);
flag = CGRectIntersectsRect(CGRectMake(0, 0, 10, 10), CGRectMake(0, 10, 10, 10));//相交一条线,也不行
NSLog(@"CGRectMake(0, 0, 10, 10), CGRectMake(0, 10, 10, 10)-》是否相交:%d",flag);
flag = CGRectIntersectsRect(CGRectMake(0, 0, 10, 10), CGRectMake(5, 9.9, 10, 10));//相交一部分,才可以成立
NSLog(@"CGRectMake(0, 0, 10, 10), CGRectMake(5, 10, 10, 10)-》是否相交:%d",flag);
三、扩充知识:
1、结构体赋值函数的原理解析:(下面是我自己写的结构体赋值函数,注意了解)
// 赋值函数的原理,如CGRectMake
CGRect CGRectMakeCustom(CGFloat x, CGFloat y, CGFloat width, CGFloat height){
CGRect rect;
rect.origin.x = x;
rect.origin.y = y;
rect.size.width = width;
rect.size.height = height;
return rect;
}
*这就是赋值结构的函数类似代码
2、CoreGraphics.framework框架
我们在使用一些操作结构体函数和CGSizeZero等,需要我们引入这个框架。
(这就是我的基本了解,希望对刚学习ios的同学有些许帮助!!!)