hello,小伙伴們幌陕,大家好!
? ?坐標(biāo)系轉(zhuǎn)換汽煮,不知道大家接觸的多不多搏熄,我個人認為咋們開發(fā)中很多地方都可以用到這個知識點棚唆。那么何為坐標(biāo)系轉(zhuǎn)換了,可以這么理解:就是在同一屏幕可視范圍內(nèi)心例,可以將任意父控件的子控件的坐標(biāo)系宵凌,轉(zhuǎn)換到同一坐標(biāo)系中。
?思路:判斷兩個不同父控件的子控件是否有交集或者重合止后。
?我們先從最簡單的開始吧瞎惫!
1,同一父控件怎么判斷译株,不同子控件是否有交集瓜喇。
? ? ? ? a,同一父控件類,兩個不同的子控件(相交)
從上圖可以清晰看到,紅色view 和綠色view 是相交的歉糜。用下面這個方法就可以做出判斷:
BOOLisIntersect = CGRectIntersectsRect(_redView.frame,_greenView.frame);
輸出結(jié)果:2017-03-02 16:42:19.471 text[12734:217314] ?1?
CGRectIntersectsRect這個方法返回的是BOOL值,如果相交返回YES,否則為NO;
? ?b,同一父控件類,兩個不同的子控件(不相交)
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é)果會不同了.先確定方法肯定是沒問題的,那么問題就出來了,是不是在同一個坐標(biāo)系中了.怎么解決問題了,后面會說道.
再看一個稍微復(fù)雜的例子(這個圖片有點模糊,圖片丟失了一次,大家見諒):
這個是求,紅色View和綠色View有無交集,從圖上可以看出,是有交集的,但是按照上面的方法我們算出來的還是為0,也就是返回的為NO,所以像這種不在同一父控件的的子控件要判斷是否重疊必須進行坐標(biāo)系轉(zhuǎn)換.
3,坐標(biāo)系轉(zhuǎn)換的方法
注意判斷子控件是否相交,最好把子控件的坐標(biāo)原點轉(zhuǎn)到相同的父控件上,這樣就不會出現(xiàn),看著有交集,計算無交集的情況了.這里推薦大家把坐標(biāo)系都轉(zhuǎn)到可是主窗口坐標(biāo)系上,這樣是肯定不會出錯的.
4,坐標(biāo)系轉(zhuǎn)換的使用場景
? ? 父子控制器,子控制器在刷新數(shù)據(jù)的情況.只需要刷新一個子控制器的數(shù)據(jù)的時候,可以利用交集判斷哪個子控制器顯示在窗口上來是先效果.