结构体NSPoint、NSRect、与NSSize或CG开头的详解

结构体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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值