一旦委、在引出問(wèn)題之前,我們先達(dá)成下面兩個(gè)共識(shí):
1.比較任何兩個(gè)物體雏亚,如果不是在以同一參照系為前提的情況下進(jìn)行比較缨硝,是沒(méi)有任何意義的。
2.一個(gè)UI控件的frame值都是相對(duì)于自身的父控件來(lái)說(shuō)的罢低。
二追葡、引出問(wèn)題
由圖中我們可以清楚的看出,藍(lán)色控件(控件A)的父控件是控制器的view奕短,而紅色控件(控件B)的父控件是灰色控件。如果直接通過(guò)比較兩個(gè)控件的frame來(lái)確定兩個(gè)控件的位置關(guān)系顯然是不正確的匀钧。
思路其實(shí)很簡(jiǎn)單翎碑,就是把兩個(gè)控件的frame轉(zhuǎn)換到同一坐標(biāo)系中,然后比較frame之斯,就能確定兩個(gè)控件的位置關(guān)系了日杈。
我個(gè)人比較傾向轉(zhuǎn)換到window中,因?yàn)樵诰唧w程序中佑刷,無(wú)論層級(jí)關(guān)系多么的復(fù)雜莉擒,window控件一般來(lái)說(shuō)都是它們的終極父控件(這個(gè)詞自己亂編的啊O(∩_∩)O哈哈~)
1.轉(zhuǎn)換控件frame的參考系
示例:
計(jì)算控件A在window中的x\y\width\height(6種方法,都一個(gè)意思)
// 1
CGRect rect = [A.superview convertRect:A.frame toView:window];
// 2
CGRect rect = [A.superview convertRect:A.frame toView:nil]; // 這邊傳入nil的話(huà)瘫絮,系統(tǒng)默認(rèn)就是window
// 3 個(gè)人比較喜歡用這個(gè)(簡(jiǎn)單明了)
CGRect rect = [A convertRect:A.bounds toView:window];
// 4
CGRect rect = [A convertRect:A.bounds toView:nil]; // 這邊傳入nil的話(huà)涨冀,系統(tǒng)默認(rèn)就是window
// 5
CGRect rect = [window convertRect:A.frame fromView:A.superview];
// 6
CGRect rect = [window convertRect:A.bounds fromView:A];
2.比較兩個(gè)CGRect的值
// 判斷是否完全一致
CG_EXTERN bool CGRectEqualToRect(CGRect rect1, CGRect rect2)
// 判斷是否包含
CG_EXTERN bool CGRectContainsRect(CGRect rect1, CGRect rect2)
// 判斷是否相交
CG_EXTERN bool CGRectIntersectsRect(CGRect rect1, CGRect rect2)
三、最后補(bǔ)充一點(diǎn)
可能有些人對(duì)window這個(gè)控件不怎么了解麦萤,(可能是我多慮了啊)鹿鳖,可以看一下我另一篇文章對(duì)window的介紹:http://www.reibang.com/p/d21427e01ef5
我畫(huà)一下上面這個(gè)例子的層級(jí)圖吧!W秤ā翅帜!