您的位置:首页 > 其它

CoreGraphics基本数据类型与函数

2013-06-06 00:45 232 查看




http://liwenqiu.me/blog/2011/11/25/coregraphics-data-type-and-functions/


基本类型


CGFloat


表示一个基本的浮点数值,在32位的机器上它就是float,64位的机器是double
CGFloat

1
2

typedef float CGFloat;     // 32-bit
typedef double CGFloat;    // 64-bit


CGPoint


表示屏幕上的一个点,由两个CGFloat值构成,分别表示 x 和 y 值
CGPoint

1
23
4
5

struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;


CGSize


包含了两个CGPoint,通常用来表示宽度和高度
CGSize

1
23
4
5

struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;


CGRect


表示一个矩形的位置和大小,由一个CGPoint和CGSize组成
CGRect

1
23
4
5

struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;


函数


CGPointMake CGSizeMake CGRectMake


CoreGraphic提供了创建这些类型对象的函数,例如:CGPointMake,CGSizeMake,CGRectMake

1
23

CGPoint point = CGPointMake(10.0f, 10.0f);
CGSize size = CGSizeMake(50.0f, 60.0f);
CGRect rect = CGRectMake(10.0f, 10.0f, 50.0f, 60.0f);


CGPointEqualToPoint


1
23
4

CGPoint point1 = CGPointMake(10.0f, 12.0f);
CGPoint point2 = CGPointMake(10.0f, 12.0f);
// 比较两个点是否相同
BOOL result = CGPointEqualToPoint(point1, point2); // YES


CGSizeEqualToSize


1
23
4

CGSize size1 = CGSizeMake(50.0f, 60.0f);
CGSize size2 = CGSizeMake(50.0f, 60.1f);
// 比较两个Size的值是否一致
BOOL result = CGSizeEqualToSize(size1, size2); // NO


CGRectEqualToRect


1
23
4

CGRect rect1 = CGRectMake(10.0f, 10.0f, 50.0f, 50.0f);
CGRect rect2 = CGRectMake(10.1f, 10.1f, 50.0f, 50.0f);
// 比较两个矩形是否在相同的位置,并且大小一致
BOOL result = CGRectEqualToRect(rect1, rect2); // NO


CGRectIntersectsRect


检测两个矩形是否有相交,这个是检测物体碰触最简单的方法

1
23
4
5
6
7
8

CGRect rect1 = CGRectMake(10.0f, 10.0f, 50.0f, 50.0f);
CGRect rect2 = CGRectMake(62.0f, 62.0f, 50.0f, 50.0f);

BOOL result = CGRectIntersectsRect(rect1, rect2) // NO
CGRect rect1 = CGRectMake(10.0f, 10.0f, 50.0f, 50.0f);
CGRect rect2 = CGRectMake(59.0f, 59.0f, 50.0f, 50.0f);

BOOL result = CGRectIntersectsRect(rect1, rect2); // YES


CGRectContainsPoint


检测一个Point是否在一个Rect之内

1
23
4

CGRect rectangle = CGRectMake(10.0f, 10.0f, 50.0f, 50.0f);
CGPoint point = CGPointMake(25.0f, 25.0f);

BOOL result = CGRectContainsPoint(rectangle, point);  // YES


CGRectContainsRect #####$


检测一个Rect是否包括在另一个Rect之内

1
23
4

CGRect rect1 = CGRectMake(0.0f, 0.0f, 50.0f, 50.0f);
CGRect rect2 = CGRectMake(5.0f, 5.0f, 10.0f, 10.0f);

BOOL result = CGRectContainsRect(rect1, rect2); // YES

注意:如果第二个rect没有完全包含在第一个rect,这个函数将返回NO

1
23
4

CGRect rect1 = CGRectMake(0.0f, 0.0f, 50.0f, 50.0f);
CGRect rect2 = CGRectMake(5.0f, 5.0f, 50.0f, 50.0f);

BOOL result = CGRectContainsRect(rect1, rect2); // NO


CGRectMinX


返回Rect在x方向上最小的值

1
2

CGRect rectangle = CGRectMake(10.0f, 10.0f, 40.0f, 40.0f);
CGFloat x = CGRectGetMinX(rectangle); // x = 10.0


CGRectMidX


返回Rect的中心点在x方向的值

1
2

CGRect rectangle = CGRectMake(10.0f, 10.0f, 40.0f, 40.0f);
CGFloat x = CGRectGetMidX(rectangle); // x = 30.0


CGRectMaxX


返回Rect在x方向上最大的值

1
2

CGRect rectangle = CGRectMake(10.0f, 10.0f, 40.0f, 40.0f);
CGFloat x = CGRectGetMaxX(rectangle); // x = 50.0


CGRectMinY


返回Rect在y方向上最小的值

1
2

CGRect rectangle = CGRectMake(10.0f, 10.0f, 40.0f, 40.0f);
CGFloat y = CGRectGetMinY(rectangle); // y = 10.0


CGRectMidY


返回Rect的中心点在y方向的值

1
2

CGRect rectangle = CGRectMake(10.0f, 10.0f, 40.0f, 40.0f);
CGFloat y = CGRectGetMinX(rectangle); // y = 30.0


CGRectMaxY


返回Rect在y方向上最大的值

1
2

CGRect rectangle = CGRectMake(10.0f, 10.0f, 40.0f, 40.0f);
CGFloat y = CGRectGetMaxY(rectangle); // y = 50.0


CGRectGetWidth CGRectGetHeight


返回Rect的高度和宽度

1
23

CGRect rectangle = CGRectMake(10.0f, 10.0f, 40.0f, 40.0f);
CGFloat width = CGRectGetWidth(rectangle); // 40.0
CGFloat height = CGRectGetHeight(rectangle); // 40.0


CGRectIsEmpty


检测Rect的大小是否是零,如果width和height之中有一个值是零,这个函数就会返回YES

1
23
4
5
6

CGRect rectangle = CGRectMake(10.0f, 10.0f, 40.0f, 40.0f);
BOOL isEmpty = CGRectIsEmpty(rectangle); // NO
CGRect rectangle = CGRectMake(10.0f, 10.0f, -40.0f, -40.0f);
BOOL isEmpty = CGRectIsEmpty(rectangle); // NO
CGRect rectangle = CGRectMake(10.0f, 10.0f, 0.0f, 0.0f);
BOOL isEmpty = CGRectIsEmpty(rectangle); // YES


CGRectIsNull


只有传递给它的参数是CGRectNull的时候,它才返回YES。CGRectNull是一个常量,稍后会提到。

1

BOOL isNull = CGRectIsNull(CGRectNull); // YES


CGRectInset


这个函数的作用在原有的Rect的基础上根据给定的x,y进行调整,例如

1
23
4
5
6
7
8

CGRect source = CGRectMake(100.0f, 100.0f, 10.0f, 10.0f);
CGRect result = CGRectInset(source, 4.0f, 4.0f);
// 新的rect的位置大小分别为: 104.0, 104.0, 2.0, 2.0
// 生成了一个内嵌与原来Rect的新Rect
CGRect source = CGRectMake(100.0f, 100.0f, 10.0f, 10.0f);
CGRect result = CGRectInset(source, -4.0f, -4.0f);
// 新的rect的位置大小分别为: 96.0, 96.0, 18.0, 18.0
// 生成了一个包含原来的Rect的新Rect

这个函数的行为可以总结出

假如:

1

CGRect new = CGRectInset(source, dx, dy);

那么:

1
23
4

new.x = source.x + dx
new.y = source.y + dy
new.width = source.width - 2 * dx
new.height = source.height - 2 * dy


CGRectIntegral


将一个rect的位置以及长宽的数值,根据四舍五入的原则取整

1
23

CGRect source = CGRectMake(10.25f, 10.45f, 10.5f, 10.5f);
CGRect result = CGRectIntegral(source);
// the result is (10.0f, 10.0f, 11.0f, 11.0f)


CGRectIntersection


返回两个Rect相交的部分的Rect

1
23
4

CGRect rect1 = CGRectMake(0.0f, 0.0f, 10.0f, 10.0f);
CGRect rect2 = CGRectMake(5.0f, 5.0f, 10.0f, 10.0f);
CGRect result = CGRectIntersection(rect1, rect2);
// the result is (5.0f, 5.0f, 5.0f, 5.0f)

如果其中一个rect内嵌于另一个rect之中,那么函数返回的就是内侧的那个rect。如果两个rect没有相交,那么返回的将是常量CGRectNull,可以用CGRectIsNull函数来检测是否有相交。

CGRectOffset


将一个rect的x,y加上指定量的位移,返回新的rect与原来的rect大小不变

1
23

CGRect rectangle = CGRectMake(10.0f, 10.0f, 10.0f, 10.0f);
CGRect result = CGRectOffset(rectangle, 5.0f, 5.0f);
// the result is (15.0f, 15.0f, 10.0f, 10.0f)


CGRectStandardize


将一个rect的宽度和高度变为它们的绝对值

1
23

CGRect rectangle = CGRectMake(10.0f, 10.0f, -10.0f, -10.0f);
CGRect result = CGRectStandardize(rectangle);
// the result is (10.0f, 10.0f, 10.0f, 10.0f)


CGRectUnion


返回一个新的Rect,它是最小的可以将两个rect完全包含再内的rect

1
23
4

CGRect rect1 = CGRectMake(10.0f, 10.0f, 10.0f, 10.0f);
CGRect rect2 = CGRectMake(30.0f, 30.0f, 10.0f, 10.0f);
CGRect result = CGRectUnion(rect1, rect2);
// the result is (10.0f, 10.0f, 10.0f, 10.0f)


CGRectDivide


这个函数有复杂,先看看它的定义

void CGRectDivide(CGRect rect, CGRect slice, CGRect remainder, CGFloat amount, CGRectEdge edge) 简单来说,这个函数的作用是将一个rect切成两个rect,切下来的部分放在slice参数指向的rect,剩余的部分放在remainder参数指向的rect。可以注意到slice和remainder参数都是指向CGRect的指针。那么从那里下刀切呢?就要看后两个参数amount和edge,先说edge,它是一个enum类型的参数,可以是CGRectMinXEdge,CGRectMaxXEdge,CGRectMinYEdge,CGRectMaxYEdge。可以理解这四个值是rect的四条边,它的作用是指定我们的“刀”要平行与哪条边来切。amount参数的作用是指定我们的“刀”距离edge指定的边的距离。通过例子来看看:

1
23
4
5
6

CGRect slice;
CGRect remainder;
CGRect rectangle = CGRectMake(0.0f, 0.0f, 100.0f, 100.0f);
CGRectDivide(rectangle, &slice, &remainder, 10.0f, CGRectMaxXEdge);
// the slien is (90.0f, 0.0f, 10.0f, 100.0f)
// the remainder is (0.0f, 0.0f, 90.0, 100.f)

上面是一个竖着切的例子,我们的“刀”是靠着右边来切的,“刀”离右边的距离有10.0f。slice得到了一个10.0f宽,100.0f高的rect。


常量


CGPointZero CGSizeZero CGRectZero


这三个常量很好理解,它们所有的值都是零,CGPointZero完全等价于CGPointMake(0.0f, 0.0f)

CGRectNull


表示一个为NULL的矩形,NULL的矩形并不是ZERO矩形。当我们函数CGRectIntersection函数的时候,传入的两个rect没有相交的时候,就会返回CGRectNull,我们只可以用CGRectIsNull来检测某个rect是不是NULL矩形。 可以看到,CoreGraphics里面定义了非常基本的数据结构,以及对这些数据进行操作的函数,对于学习CoreGraphics来说,这些是非常基础的东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: