hello,小伙伴們,大家好!
? ?坐標(biāo)系轉(zhuǎn)換,不知道大家接觸的多不多,我個(gè)人認(rèn)為咋們開發(fā)中很多地方都可以用到這個(gè)知識(shí)點(diǎn)。那么何為坐標(biāo)系轉(zhuǎn)換了,可以這么理解:就是在同一屏幕可視范圍內(nèi),可以將任意父控件的子控件的坐標(biāo)系,轉(zhuǎn)換到同一坐標(biāo)系中。
?思路:判斷兩個(gè)不同父控件的子控件是否有交集或者重合。
?我們先從最簡(jiǎn)單的開始吧!
1,同一父控件怎么判斷,不同子控件是否有交集。
? ? ? ? a,同一父控件類,兩個(gè)不同的子控件(相交)

從上圖可以清晰看到,紅色view 和綠色view 是相交的。用下面這個(gè)方法就可以做出判斷:
BOOLisIntersect = CGRectIntersectsRect(_redView.frame,_greenView.frame);
輸出結(jié)果:2017-03-02 16:42:19.471 text[12734:217314] ?1?
CGRectIntersectsRect這個(gè)方法返回的是BOOL值,如果相交返回YES,否則為NO;
? ?b,同一父控件類,兩個(gè)不同的子控件(不相交)

BOOLisIntersect = CGRectIntersectsRect(_redView.frame,_greenView.frame);
輸出結(jié)果:2017-03-02 16:42:19.471 text[12734:217314] ?0
2,不同父控件的情況,不同子控件是否有交集

同樣按上述方法執(zhí)行后,結(jié)果如圖所示.問什么我們看到的紅色View和粉色view還有綠色View都有相交,為什么打印出來的結(jié)果會(huì)不同了.先確定方法肯定是沒問題的,那么問題就出來了,是不是在同一個(gè)坐標(biāo)系中了.怎么解決問題了,后面會(huì)說道.
再看一個(gè)稍微復(fù)雜的例子(這個(gè)圖片有點(diǎn)模糊,圖片丟失了一次,大家見諒):

這個(gè)是求,紅色View和綠色View有無交集,從圖上可以看出,是有交集的,但是按照上面的方法我們算出來的還是為0,也就是返回的為NO,所以像這種不在同一父控件的的子控件要判斷是否重疊必須進(jìn)行坐標(biāo)系轉(zhuǎn)換.
3,坐標(biāo)系轉(zhuǎn)換的方法

注意判斷子控件是否相交,最好把子控件的坐標(biāo)原點(diǎn)轉(zhuǎn)到相同的父控件上,這樣就不會(huì)出現(xiàn),看著有交集,計(jì)算無交集的情況了.這里推薦大家把坐標(biāo)系都轉(zhuǎn)到可是主窗口坐標(biāo)系上,這樣是肯定不會(huì)出錯(cuò)的.
4,坐標(biāo)系轉(zhuǎn)換的使用場(chǎng)景
? ? 父子控制器,子控制器在刷新數(shù)據(jù)的情況.只需要刷新一個(gè)子控制器的數(shù)據(jù)的時(shí)候,可以利用交集判斷哪個(gè)子控制器顯示在窗口上來是先效果.