结构体NSPoint、NSRect、与NSSize或CG开头的详解
1、坐标类NSPoint与CGPoint
(1)NSPoint是表示UI元素的坐标的,等同于CGPoint,点击NSPoint进入文档(注意:坐标指组件左上角在屏幕中的坐标,x值从左到右增加,y值从上到下增加)
typedef CGPoint NSPoint; 点击CGPoint 进入继续如下:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
再点击CGFloat进入继续进入文档如下:
# define CGFLOAT_TYPE double
typedef CGFLOAT_TYPE CGFloat;
所以说CGFloat就是double类型的数据。而NSPoint==CGPoint是封装坐标的类,当开发时使用CGPoint,因为它可以跨平台使用。
(2)坐标类的创建(有如下两种最常用的方式):
CGPoint p1=NSMakePoint(10,10);
NSPoint p2=CGPointMake(20,20);
2、尺寸类NSSize与CGSize
(1)NSSize是表示UI组件的宽度和高度的,等同于CGSize,点击NSSize进入开发文档如下:
typedef CGSize NSSize; 点击CGSize进入如下:
struct CGSize {
CGFloat width;//已知CGFloat就是是double
CGFloat height;
};
typedef struct CGSize CGSize;
NSSize与CGSize是表示UI组件的尺寸的。同样创建尺寸类的方法上同:
NSSize s1=CGSizeMake(100,50);
NSSize s2=NSMakeSize(100,50);
CGSize s3=NSMakeSize(200,60);
3、NSRect与CGRect(组件所占的区域范围)
点击NSRect进入
typedef CGRect NSRect; 点击CGRect进入
struct CGRect {
CGPoint origin;//组件所占区域的起点坐标
CGSize size;//组件所占区域的宽度和长度
};
typedef struct CGRect CGRect;
创建此类的方法如下:
NSRect rect=NSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h)
即CGRect cr=CGMakeRect(0,0,100,50);
4、同一打印结构体的每个变量:
如果按普通的方式一一进行输出很麻烦。完全可以用另外一种方式:
可以将一个结构体转换为字符串,直接打印即可。
例如将NSPoint转换为字符串的方法如下:
NSString *str=NSStringFromPoint(p1);//p1为NSPoint对象
别的也与此类似例如NSSize,NSRect转换为字符串如下:
NSString *str=NSStringFromSize(s3); //s3是NSSize对象
NSString *str=NSStringFromSize(rect);//rect是NSRect对象
5、以上类的其它简便用法
创建一个NSRect的另一种方法:
CGRect rect={{0,0},{100,90}}; 或者CGRect rect={p1,s2};
开发中经常用到坐标原点CGPointMake(0,0)等同于一个常量CGPointZero 所以以上的定义也可以写作如下格式:
CGPoint rect={CGPointZero,CGSizeMake(100,90)};
与此类似也有CGRect类型常量CGRectZero表示起始位置和宽高都为0,也有CGSize类型的常量CGSizeZero它表示宽高都为0。
6、比较是否以上类是否相同的方法:
CGPointEqualToPoint(CGPoint point1, CGPoint point2)
CGSizeEqualToSize(CGSize size1, CGSize size2);
CGRectEqualToRect(CGRect rect1, CGRect rect2);
都是返回BOOL类型的值。
注意:一般以CG开头的都是CoreGraphics框架内的类。以上类都是。
CoreGraphics这个框架是跨平台的。
7、用以下方法判断某个点point在没在左方的rect区域内
BOOL b=CGRectContainsPoint(CGRect rect, CGPoint point);
NSRect(CGRect)结构及其常用接口详解
https://www.jianshu.com/p/e65ec000623a
2018.09.03 11:39* 字数 336 阅读 210评论 0喜欢 1
一、结构
NSRect是一个用来表示矩形的结构体,在苹果官方文档中其声明如下:
ypedef CGRect NSRect;
从上述声明来看,NSRect与CGRect是同一个类型,其定义汇总如下:
struct CGRect {
CGPoint origin; //起点坐标(x,y)
CGSize size; //大小 width*height
};
typedef struct CGRect CGRect;
//坐标点
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
//大小
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
那么CGFloat是什么鬼呢?
在32位平台下CGFloat实际上就是float,在64位平台下CGFloat是double。
二、接口
1、创建NSRect。
//创建一个起点坐标(10,20),宽度100,高度30的矩形。
NSRect testRect1 = NSMakeRect(10, 20, 100, 30);
CGRect testRect2 = CGRectMake(10, 20, 100, 30);
2、获取相关属性。
NSRect的特殊点
//NS系列
NSLog(@"MinX = %lf",NSMinX(testRect1)); //10
NSLog(@"MidX = %lf",NSMidX(testRect1)); //10+100/2
NSLog(@"MaxX = %lf",NSMaxX(testRect1)); //10+100
NSLog(@"MinY = %lf",NSMinY(testRect1)); //20
NSLog(@"MidY = %lf",NSMidY(testRect1)); //20+30/2
NSLog(@"MaxY = %lf",NSMaxY(testRect1)); //20+30
//CG系列
NSLog(@"MinX = %lf",CGRectGetMinX(testRect2));
NSLog(@"MidX = %lf",CGRectGetMidX(testRect2));
NSLog(@"MaxX = %lf",CGRectGetMaxX(testRect2));
NSLog(@"MinY = %lf",CGRectGetMinY(testRect2));
NSLog(@"MidY = %lf",CGRectGetMidY(testRect2));
NSLog(@"MaxY = %lf",CGRectGetMaxY(testRect2));
//矩形的中心坐标
NSPoint mid = NSMakePoint(NSMidX(testRect1),NSMidY(testRect1));
3、NSRect与CGRect的相互转换。
既然前文说过了NSRect与CGRect是同一个东西,讲道理在使用时可以不需要进行转换。
实际上我们在项目中为了规范,为了维护的便利性,我们还是需要用两个函数来进行转换:
//NSRect转换为CGRect
CGRect toCGRect = NSRectToCGRect(testRect1);
//CGRect转换为NSRect
NSRect toNSRect = NSRectFromCGRect(testRect2);
4、两个转换函数定义(额外)
可能有些小伙伴好奇了,既然NSRect与CGRect是同一个类型,那么转换函数是怎么做的呢?
//去掉内联宏之后转换代码如下
NSRect NSRectFromCGRect(CGRect cgrect) {
union _ {NSRect ns; CGRect cg;};
return ((union _ *)&cgrect)->ns;
}
CGRect NSRectToCGRect(NSRect nsrect) {
union _ {NSRect ns; CGRect cg;};
return ((union _ *)&nsrect)->cg;
}
三、绘制矩形
1、新建项目,在storyboard中添加一个Custom View。
2、选中Custom View,设置其Custom Class为“MyView”。
3、新建文件MyView,继承于NSView类。
4、重写initWithCoder方法,代码如下:
-(instancetype)initWithCoder:(NSCoder *)decoder{
self = [super initWithCoder:decoder];
if(self){
self.wantsLayer = YES;
self.layer.borderWidth = 1;
}
return self;
}
5、在drawRect方法中,代码如下:
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
CAShapeLayer *myRectLayer = [CAShapeLayer layer]; //初始化一个层
CGMutablePathRef path = CGPathCreateMutable(); //初始化路径
CGRect testRect2 = CGRectMake(10, 20, 100, 30); //初始化Rect
CGPathAddRect(path, NULL, testRect2);
myRectLayer.path = path; //设置层的路径
myRectLayer.fillColor = [NSColor redColor].CGColor; //设置填充色
myRectLayer.strokeColor = [NSColor blueColor].CGColor; //设置画笔颜色
myRectLayer.lineWidth = 1; //设置画笔粗细
[self.layer addSublayer:myRectLayer]; //将矩形层添加至View中
}
6、运行程序,查看效果。
image.png