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

结构体NSPoint、NSRect、与NSSize或CG开头的详解相关推荐

  1. java半碳前叉结构,山地车避震前叉功能及原理分类详解(图文)

    什么是山地车避震前叉?山地车避震前叉的作用是什么?同没有减震前叉的车有什么区别?山地车避震前叉的维修保养.如上等等一系列关于山地车避震前叉的问题苦恼了很多车友,及新手朋友们,下面,小编为你汇总了山地车 ...

  2. Seaborn学习(一)------- 构建结构化多绘图网格(FacetGrid()、map())详解

    在探索中等维数据时,一种有用的方法是在数据集的不同子集上绘制同一图的多个实例.这种技术有时被称为"格子"或"格子"绘图,它与"小倍数"的概念 ...

  3. 自定义类型详解:结构体(内存对齐、位段) + 枚举 + 联合

    目录 一.结构体 1.特殊的声明 2.结构体自引用 3.结构体变量的定义和初始化 4.打印结构体 二.==结构体内存对齐== 1.内存对齐 结构体嵌套如何求 为什么存在内存对齐? 2.修改默认对齐数 ...

  4. 结构体的大小该如何计算?

    1. 第一个成员在与结构体变量偏移量为 0 的地址处. 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处. 对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值 . VS 中默认的 ...

  5. linux中c语言结构体详解,Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  6. python展开 c函数中的宏预处理_Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  7. 结构体-struct

    struct struct的声明 struct的定义 struct的初始化 先声明再赋值 声明同时初始化 键值对初始化 值列表初始化 注意事项 匿名结构体 指针类型结构体初始化 先声明再赋值 声明同时 ...

  8. python提取结构体取值,python读取结构体数据

    Python向怎么向C语言传递结构体 海康的SDK,我要用Python写代码登录相机,怎么传递参数 C中的函数,需要况如下: 打算从Python发一个TCP数据包给远程服务器,数据的主体是一个C语言的 ...

  9. C/C++ 结构体定义及使用

      最近在使用结构体时,碰到了各种各样的用法,搞得我很乱,因此就好好查了下资料,又看了看书上是怎么写的,然后在这里做个总结,记录一下.   参考网址如下: // 这个讲的特别详细,主要是C++的用法, ...

最新文章

  1. 金融数据分析(二)-------基本资本,金融衍生品,资本收益率
  2. Win10电脑录屏,视频有杂音,用耳机录音
  3. Git 查看提交历史
  4. 一种zernike多项式的解释(暂时没有弄完)
  5. go 中recover捕获异常
  6. SimpleXML系列函数操作XML
  7. iOS开发中的HTML解析
  8. 网工学习笔记——reboot
  9. Qt之调用Windows图片查看器预览图片
  10. @Resource注解用法
  11. 越喜欢村上春树,就越懂得生活
  12. ALV中的回车事件相应及添加F4帮助
  13. STM32下载中出现Flash Download failed - Target DLL has been cancelled报错
  14. Spring Cloud(四):Spring Cloud Alibaba Feign Dubbo
  15. 不懂年轻人,还怎么带团队
  16. 个人看法(设计思想)
  17. Phind-面向程序员的AI聊天对话机器人
  18. 虹科ELPRO - EMS系统实现苏州某医药仓库温湿度自动监测 - 100% GxP合规
  19. 大数据舆情分析软件实时监控,TOOM大数据处理与舆情监控简介
  20. TP link driver - TL-WN823N linux驱动

热门文章

  1. MSSQLSERVER错误1
  2. NOT NULL约束
  3. 解决:adb 提示adb server version(31) doesn't match this client(41) 解决办法
  4. hdu-3016-Man Down(线段树)
  5. 关于样本标准差(SD)与样本标准误差(SE)
  6. 荣耀8x系列新机解锁双喇叭设计,小米没做到的它做到了
  7. ART与Dalvik哪个好用 ART模式和Dalvik模式区别对比分析
  8. A Perfectly Balanced String? (Codeforces Round #785 (Div. 2))
  9. SOLIDWORKS又显示内存不足了?用这几个办法试试看
  10. 抖音创作规范_抖音短视频运营小规则