CGGeometry是用C語言實(shí)現(xiàn)的一個(gè)封裝了許多常用幾何方法的文件
結(jié)構(gòu)體
#pragma mark - 結(jié)構(gòu)體
/* 定義一個(gè)點(diǎn),設(shè)置x坐標(biāo)和y坐標(biāo) */
struct
CGPoint {
CGFloat x;
CGFloat y;
};
/* 定義一個(gè)尺寸,設(shè)置寬度和高度 */
struct CGSize {
CGFloat width;
CGFloat height;
};
/* 定義一個(gè)二維矢量 */
struct CGVector {
CGFloat dx;
CGFloat dy;
};
/* 定義一個(gè)矩形*/
struct CGRect {
CGPoint origin;
CGSize size;
};
全局常量
#pragma mark - 全局常量
/*零點(diǎn),與CGPointMake(0, 0)等效 */
const CGPoint CGPointZero
/*零尺寸,與CGSizeMake(0, 0)等效*/
const CGSize CGSizeZero
/*零矩形,與CGRectMake(0, 0, 0, 0)等效*/
const CGRect CGRectZero
/*空矩形,這個(gè)和零矩形并不相同,當(dāng)我們返回兩個(gè)不相交矩形的交集時(shí),會(huì)返回空矩形 */
const CGRect CGRectNull
/* 無限的矩形 */
const CGRect CGRectInfinite
#pragma mark - 創(chuàng)建幾何
/* 根據(jù)`(x, y)`創(chuàng)建一個(gè)點(diǎn) */
CGPoint CGPointMake(CGFloat x, CGFloat y);
/* 根據(jù) `(width, height)'創(chuàng)建一個(gè)尺寸*/
CGSize CGSizeMake(CGFloat width, CGFloat height);
/* 根據(jù) `(dx, dy)'創(chuàng)建一個(gè)矢量 */
CGVector CGVectorMake(CGFloat dx, CGFloat dy);
/* 根據(jù) `(x, y; width, height)'創(chuàng)建一個(gè)矩形*/
CGRect CGRectMake(CGFloat x, CGFloat y, CGFloat width,
CGFloat height);
獲取幾何參數(shù)
#pragma mark - 獲取幾何參數(shù)
/* 根據(jù) `rect'參數(shù),獲得矩形最左邊的x值 */
CGFloat CGRectGetMinX(CGRect rect)
/* 根據(jù) `rect'參數(shù),獲得矩形x軸中心點(diǎn)的值*/
CGFloat CGRectGetMidX(CGRect rect)
/*根據(jù) `rect'參數(shù), 獲取矩形最右端的x值*/
CGFloat CGRectGetMaxX(CGRect rect)
/*根據(jù) `rect'參數(shù), 獲取矩形最頂端的y值*/
CGFloat CGRectGetMinY(CGRect rect)
/* 根據(jù) `rect'參數(shù),獲得矩形y軸中心點(diǎn)的值*/
CGFloat CGRectGetMidY(CGRect rect)
/*根據(jù) `rect'參數(shù), 獲取矩形最底端的y值*/
CGFloat CGRectGetMaxY(CGRect rect)
/*根據(jù) `rect'參數(shù), 獲取矩形寬度*/
CGFloat CGRectGetWidth(CGRect rect)
/*根據(jù) `rect'參數(shù), 獲取矩形高度*/
CGFloat CGRectGetHeight(CGRect rect)
/*根據(jù)一個(gè)矩形創(chuàng)建一個(gè)標(biāo)準(zhǔn)的矩形*/
CGRect CGRectStandardize(CGRect rect)
/* 創(chuàng)建一個(gè)內(nèi)嵌的矩形,中心和rect參數(shù)的中心一樣,將 rect 的坐標(biāo)(origin)按照(dx,dy) 進(jìn)行平移,然后將 rect 的大小(size) 寬度縮小2倍的 dx,高度縮小2倍的 dy. */
CGRect CGRectInset(CGRect rect, CGFloat dx, CGFloat dy)
/* 根據(jù)`rect' 參數(shù),返回四個(gè)參數(shù)都是整數(shù)的矩形 */
CGRect CGRectIntegral(CGRect rect)
/* 返回 `r1' 和 `r2'并集*/
CGRect CGRectUnion(CGRect r1, CGRect r2)
/* 返回 `r1' 和 `r2'交集,如果沒有交集返回CGRectNull */
CGRect CGRectIntersection(CGRect r1, CGRect r2)
/* 返回一個(gè)矩形,偏移量相對(duì)于rect,根據(jù)進(jìn)行平移 */
CGRect CGRectOffset(CGRect rect, CGFloat dx, CGFloat dy)
/**
將一個(gè) CGRect 切割成兩個(gè) CGRect
@param rect 原矩形
@param slice 切割的 CGRect 的指針
@param remainder 切割后剩下的 CGRect 的指針
@param amount 切割的大小,是edge開始計(jì)算的方向
@param edge CGRectMinXEdge(從x的最小處進(jìn)行垂直分割)、 CGRectMinYEdge(從y的最小處進(jìn)行水平分割)、CGRectMaxXEdge(從x最大處進(jìn)行垂直分割)、 CGRectMaxYEdge(從y最大處進(jìn)行水平分割)
*/
void CGRectDivide(CGRect rect, CGRect * slice,
CGRect * remainder, CGFloat amount, CGRectEdge edge)
判斷幾何
#pragma mark - 判斷幾何
/* 如果 `point1' 和`point2' 相等返回YES, 否則返回NO*/
bool CGPointEqualToPoint(CGPoint point1, CGPoint point2)
/* 如果`size1' 和 `size2' 相等返回YES, 否則返回NO */
bool CGSizeEqualToSize(CGSize size1, CGSize size2)
/* 如果`rect1' 和 `rect2' 相等返回YES, 否則返回NO */
bool CGRectEqualToRect(CGRect rect1, CGRect rect2)
/* 如果`rect'為空返回YES, 否則返回NO */
bool CGRectIsEmpty(CGRect rect);
/* 如果 `rect' 為null返回YES, 否則返回NO */
bool CGRectIsNull(CGRect rect)
/* 如果 `rect' 是無限矩形返回YES, 否則返回NO */
bool CGRectIsInfinite(CGRect rect);
/* 判斷點(diǎn)是否在矩形內(nèi)*/
bool CGRectContainsPoint(CGRect rect, CGPoint point)
/* 判斷矩形1是否包含矩形2*/
bool CGRectContainsRect(CGRect rect1, CGRect rect2)
/* 判斷矩形1和矩形2是否相交*/
bool CGRectIntersectsRect(CGRect rect1, CGRect rect2)
CGRectInset 與 CGRectOffset的區(qū)別
概念:
CGRectInset:對(duì)矩形進(jìn)行平移和縮放兩個(gè)操作
CGRectOffset:只對(duì)矩形進(jìn)行平移,不會(huì)改變其大小
計(jì)算過程(偽代碼)
CGRectInset:
CGRect rect = CGRectMake(x, y, width, height);
CGRect rectInset = CGRectInset(rect, dx, dy);
rectInset = CGRectMake(dx, dy, (width - ( dx * 2)), (height - ( dy * 2)) );
CGRectOffset:
CGRect rect = CGRectMake(x, y, width, height);
CGRect rectOffset = CGRectOffset(rect, dx, dy);
rectOffset = CGRectMake((x + dx), (y + dy), width, height );
示例
CGRectInset:
CGRect rect = CGRectMake(0, 0, 30, 30);
CGRect rectInset = CGRectInset(rect, 10, 10);
CGRect bigRectInset = CGRectInset(rect, -10, -10);
NSLog(@"rectInset:%@ \n bigRectInset:%@", NSStringFromCGRect(rectInset), NSStringFromCGRect(bigRectInset));
// rectInset:{{10, 10}, {10, 10}}
// bigRectInset:{{-10, -10}, {50, 50}}
CGRectOffset:
CGRect rect = CGRectMake(10, 10, 30, 30);
CGRect rectOffset = CGRectOffset(rect, 10, 10);
CGRect leftRectOffset = CGRectOffset(rect, -10, -10);
NSLog(@"rectOffset:%@ \n leftRectOffset:%@", NSStringFromCGRect(rectOffset), NSStringFromCGRect(leftRectOffset));
// rectOffset:{{20, 20}, {30, 30}}
// leftRectOffset:{{0, 0}, {30, 30}}
CGRectDivide
用來分割矩形,參數(shù)rect是源矩形,slice和remainder是分割后的兩部分矩形,amount是分割線,edge是分割選項(xiàng)。
edge分割方式
typedef CF_ENUM(uint32_t, CGRectEdge) {
//從x的最小處進(jìn)行垂直分割
CGRectMinXEdge,
//從y的最小處進(jìn)行水平分割
CGRectMinYEdge,
//從x最大處進(jìn)行垂直分割
CGRectMaxXEdge,
//從y最大處進(jìn)行水平分割
CGRectMaxYEdge
};
計(jì)算過程(偽代碼)
CGRect rect = CGRectMake(x, y, width, height);
CGRectDivide(rect, &slice,
&remainder, amount, edge);
switch (edge) {
case CGRectMinXEdge: {
*slice = CGRectMake(x, y, amount, height);
*remainder = CGRectMake(x + amount, y, width - amount, height);
}
break;
case CGRectMaxXEdge: {
*slice = CGRectMake(width - amount, y, amount, height);
*remainder = CGRectMake(x, y, width - amount, height);
}
break;
case CGRectMinYEdge: {
*slice = CGRectMake(x, y, width, amount);
*remainder = CGRectMake(x, y + amount, width, height - amount);
}
break;
case CGRectMaxYEdge: {
*slice = CGRectMake(width, y - amount, width, amount);
*remainder = CGRectMake(x, y, width, height - amount);
}
break;
}
示例
CGRect slice;
CGRect remainder;
CGRect rect = CGRectMake(0, 0, 200, 200);
CGRectDivide(rect, &slice, &remainder, 50, CGRectMinXEdge);
NSLog(@"slice:%@ \n remainder:%@", NSStringFromCGRect(slice), NSStringFromCGRect(remainder));
// CGRectMinXEdge
// slice:{{0, 0}, {50, 200}}
// remainder:{{50, 0}, {150, 200}}
// CGRectMaxXEdge
// slice:{{150, 0}, {50, 200}}
// remainder:{{0, 0}, {150, 200}}
// CGRectMinYEdge
// slice:{{0, 0}, {200, 50}}
// remainder:{{0, 50}, {200, 150}}
// CGRectMaxYEdge
// slice:{{0, 150}, {200, 50}}
// remainder:{{0, 0}, {200, 150}}
總結(jié)
在沒有對(duì)CGGeometry進(jìn)行深入的了解時(shí),只會(huì)用到平時(shí)常用的幾個(gè)方法,可是深入了解后還是會(huì)發(fā)現(xiàn)有很多實(shí)用而自己卻一直不知道的方法。