CGRect使用技巧

2021-06-19 03:57:38 字數 3858 閱讀 9022

在ios開發中經常需要處理點,大小以及矩形,對應的資料結構分別為cgpoint,cgsize,cgrect,這些資料結構都是c結構體,定義分別如下:

cgpoint ;

cgsize ;

struct cgrect ;

操作這些資料結構有一些方便的方法,總結如下:

1.建立cgpoint,cgsize,cgrect

cgsize size = cgsizemake (10.0, 20.0);

cgpoint center = cgpointmake (60.0, 240.0);

cgrect bounds = cgrectmake (5.0, 10.0, 100.0, 200.0);

一些特殊情況

零點 cgpointzero; 即(x=0.0, y=0.0),等價於gpointmake(0,0);

零大小 cgsizezero; 即(width=0.0, height= 0.0),等價於cgsizemake(0,0);

零矩形 cgrectzero; 即((x=0.0,y= 0.9),(width=0.0,height=0.0)),等價於cgrectmake(0,0,0,0).

空矩形 cgrectnull; 取兩個不相交矩形的相交區域會返回cgrectnull,乙個矩形與cgrectnull的並集為原矩形。,使用cgrectisnull判斷乙個矩形是否為cgrectnull。cgrectisempty對cgrectzero和cgrectnull都返回true;

無限矩形 cgrectinfinite 具有無限區域的矩形,可使用cgrectisinfinite進行判斷。

2.判斷兩個點,大小,矩形是否相等

bool cgpointequaltopoint (cgpoint point1, cgpoint point2);

bool cgsizeequaltosize (cgsize size1, cgsize size2);

bool cgrectequaltorect (cgrect rect1, cgrect rect2);

cgpoint,cgsize,cgrect的內部資料都是cgpoint,對於浮點數,由於可能存在捨入誤差,不能直接判斷兩者是否相等,而應該判斷兩個值的差是否足夠小。使用上述方法可以避免手工做這些判斷,簡化**。

3. 獲取矩形邊界,中點座標值,長寬

獲取邊界座標值,即x,y的最大值與最小值。

cgfloat cgrectgetminx(cgrect rect);

cgfloat cgrectgetmaxx(cgrect rect);

cgfloat cgrectgetminy(cgrect rect);

cgfloat cgrectgetmaxy(cgrect rect);

獲取中點座標值,即x,y的中點

cgfloat cgrectgetmidx(cgrect rect);

cgfloat cgrectgetmidy(cgrect rect);

獲取矩形長,寬

cgfloat cgrectgetwidth(cgrect rect);

cgfloat cgrectgetheight(cgrect rect);

4.對稱縮排cgrect
cgrect arectangle = cgrectmake(0,0, 100, 200);

cgrect smallerrectangle = cgrectinset(arectangle, 10, 20);

// result origin (10, 20) and size (80, 160)

5. 非對稱縮排cgrect
cgrect rect = cgrectmake(0, 0, 100, 200);

uiedgeinsets contentinsets = uiedgeinsetsmake(10, 20, 30, 40);

cgrect result = uiedgeinsetsinsetrect(rect, contentinsets);

//result origin(20,10) and size(40,160)

6. 調整小數畫素cgrect到整數畫素

將origin值向下調整到最近整數,size向上調整到最近整數,使生成的cgrect可以完全包含原來的cgrect.

cgrect rect = cgrectmake(5, 7.5, 50, 29);

uiedgeinsets contentinsets = uiedgeinsetsmake(10, 20, 30, 40);

cgrect result = cgrectintegral(rect);

//result origin(5,7) and size(50,30)

7. 檢查矩形內是否包含某點
cgrect enemyrect = cgrectmake(0, 0, 100, 200);

cgpoint hitpoint = cgpointmake(50, 50);

if(cgrectcontainspoint(enemyrect, hitpoint))

8.檢查兩矩形是否相交
cgrect playerrect = ccrectmake(200, 300, 10, 10);

cgrect minerect = cgrectmake(10, 10, 20, 20);

if(cgrectintersectsrect(playerrect, minerect))

9. cgrect與nsstring 轉換
cgrect rect = cgrectmake(0, 0, 100, 200);

nsstring *rectstring = nsstringfromcgrect(rect))

cgrect newrect = cgrectfromstring(rectstring);

10.cgrect與nsdictionary轉換
cgrect rect = cgrectmake(0, 0, 100, 200);

cfdictionaryref framedictref = cgrectcreatedictionaryrepresentation(rect);

nsdictionary*framedict = [nsdictionary dictionarywithdictionary:(nsdictionary*)framedictref]; // autoreleased

cfrelease(framedictref);

nslog(@"%@", framedict);

cgrect newrect;

cgrectmakewithdictionaryrepresentation((cfdictionaryref)framedict, &rect);

10. cgrect與nsvalue轉換

在nsarray,nsdictionary容器中只能儲存objetive-c物件,不能直接儲存c結構體,所有需要儲存矩形時,需要將其轉換為nsvalue值。

cgrect rect = cgrectmake(0, 0, 100, 200);

nsvalue *value = [nsvalue valuewithcgrect:rect];

cgrect newrect = [value rectvalue];

cgrect tricks

rectangles, part 1

rectangles, part 2

a potential pitfall of cgrectintegral

告別噁心的CGRect設定

all you need to do is dropframeaccessorfiles into your project,and add include frameaccessor.h to the top of files that will use it.你需要做的就是把資料夾frameac...

輸出CGRect結構體的值

想要檢視某個控制項的座標,其實在控制項打乙個斷點 直接在控制台輸出 po view,就會顯示view的各種屬性資訊 但是要使用cgrect檢視其值也是可以的,cgrect是一種結構體,佔位符一般代表物件型別,因此,需要做轉換再nslog了,如下 cgrect 結構體 物件型別的佔位符 cgrect ...

UIView的類擴充套件,擴充套件CGRect

菜雞成長日記 感慨 剛接觸ios程式設計的時候我們常常會先敲 同時學習基礎知識,如果是培訓出來的童鞋,由於沒有基礎或者基礎比較薄弱,往往會發現很多知識都沒怎麼理解,這時候自學 從網上找資料 和討論往往能更有效率的獲得知識 菜雞成長日記 內容 看到前輩們總是在乙個專案中對uiview進行類方法的擴充套...