轉(zhuǎn)換坐標(biāo)系

轉(zhuǎn)換坐標(biāo)系的本質(zhì)就是將特定區(qū)域相對(duì)某一區(qū)域(A)原點(diǎn)的坐標(biāo)系(O)轉(zhuǎn)換成相對(duì)于另一區(qū)域(B)原點(diǎn)的新坐標(biāo)系(N),只改變x和y的值

 N.frame.origin.x = O.frame.origin.x + ( A.frame.origin.x - B.frame.origin.x);
 N.frame.origin.y = O.frame.origin.y + ( A.frame.origin.y - B.frame.origin.y);

結(jié)合日常使用場(chǎng)景,因?yàn)?frame 本身就是相對(duì)于父控件而言的少漆,所以為了方便理解臼膏,以下直接使用父控件來(lái)說(shuō)明,但實(shí)際上轉(zhuǎn)換坐標(biāo)系無(wú)論是調(diào)用的 view 還是目標(biāo) view 都可以是與父控件無(wú)關(guān)的 view


  • 父控件調(diào)用示损,使用 toView
  • 目標(biāo)控件調(diào)用渗磅,使用 fromView

兩種方法返回值都是一樣的,都是 ponit 或者 rect 參照目標(biāo)控件的新坐標(biāo),另外

  • 使用bounds 可以理解自己就是自己的父控件
  • view傳入 nil 時(shí)可以理解為當(dāng)前的 window检访,此時(shí)需注意window是否已經(jīng)創(chuàng)見(jiàn)始鱼,例如在viewDidLoad中就不能這么用,因?yàn)榇藭r(shí)尚未創(chuàng)見(jiàn)窗口
/**
 *  父控件調(diào)用脆贵,將某個(gè)點(diǎn)從父控件坐標(biāo)系轉(zhuǎn)換為參照view坐標(biāo)系
 *
 *  @param point 待轉(zhuǎn)換坐標(biāo)的point
 *  @param view  目標(biāo)控件
 *
 *  @return 以目標(biāo)坐標(biāo)系為參照的新point
 */
- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;

/**
 *  目標(biāo)控件調(diào)用医清,將某個(gè)點(diǎn)從父控件坐標(biāo)系轉(zhuǎn)換為參照view坐標(biāo)系
 *
 *  @param point 待轉(zhuǎn)換坐標(biāo)的point
 *  @param view  父控件
 *
 *  @return 以目標(biāo)坐標(biāo)系為參照的新point
 */
- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;

/**
 *  父控件調(diào)用,將某個(gè)點(diǎn)從父控件坐標(biāo)系轉(zhuǎn)換為參照view坐標(biāo)系
 *
 *  @param rect 待轉(zhuǎn)換坐標(biāo)的rect
 *  @param view 目標(biāo)控件
 *
 *  @return 以目標(biāo)坐標(biāo)系為參照的新rect
 */
- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;

/**
 *  目標(biāo)控件調(diào)用卖氨,將某個(gè)點(diǎn)從父控件坐標(biāo)系轉(zhuǎn)換為參照view坐標(biāo)系
 *
 *  @param rect 待轉(zhuǎn)換坐標(biāo)的rect
 *  @param view 父控件
 *
 *  @return 以目標(biāo)坐標(biāo)系為參照的新rect
 */
- (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;

用法舉例一: 求某一控件相對(duì)于另一控件的坐標(biāo)系

 // 窗口中有控件red 会烙、yellow、blue, 其中blue是yellow的子控件双泪,現(xiàn)需要得到blue參照red的坐標(biāo)系
    UIView *red = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    red.backgroundColor = [UIColor redColor];
    
    UIView *yellow = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    yellow.backgroundColor = [UIColor yellowColor];
    
    UIView *blue = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
    blue.backgroundColor = [UIColor blueColor];
    
    [self.view addSubview:red];
    [self.view addSubview:yellow];
    [yellow addSubview:blue];
  // 轉(zhuǎn)換坐標(biāo)系
    CGRect newRectUseTo = [blue.superview convertRect:blue.frame toView:red];
    CGRect newRectUseFrom = [red convertRect:blue.frame fromView:blue.superview];
  
   // 使用bounds 可以理解自己就是自己的父控件持搜,所以以上兩個(gè)方法也可以寫成
    CGRect newRectUseTo2 = [blue convertRect:blue.bounds toView:red];
    CGRect newRectUseFrom2 = [red convertRect:blue.bounds fromView:blue];
    
    NSLog(@"newRectUseTo - %@,\nnewRectUseFrom - %@,\nnewRectUseTo2 - %@,\nnewRectUseFrom2 - %@\n ", NSStringFromCGRect(newRectUseTo), NSStringFromCGRect(newRectUseFrom), NSStringFromCGRect(newRectUseTo2), NSStringFromCGRect(newRectUseFrom2));

最終輸出結(jié)果是:
newRectUseTo - {{150, 150}, {50, 50}},
newRectUseFrom - {{150, 150}, {50, 50}},
newRectUseTo2 - {{150, 150}, {50, 50}},
newRectUseFrom2 - {{150, 150}, {50, 50}}

用法舉例二 求某一控件相對(duì)于窗口的坐標(biāo)系

    UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
    CGRect newRect = [blue convertRect:blue.bounds toView:window];
NSLog(@"newRect - %@, ", NSStringFromCGRect(newRect);

最終輸出結(jié)果是:
newRect - {{150, 150}, {50, 50}},

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焙矛,隨后出現(xiàn)的幾起案子葫盼,更是在濱河造成了極大的恐慌,老刑警劉巖村斟,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贫导,死亡現(xiàn)場(chǎng)離奇詭異抛猫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)孩灯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門闺金,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人峰档,你說(shuō)我怎么就攤上這事败匹。” “怎么了讥巡?”我有些...
    開(kāi)封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵掀亩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我欢顷,道長(zhǎng)槽棍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任抬驴,我火速辦了婚禮炼七,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘布持。我一直安慰自己豌拙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布题暖。 她就那樣靜靜地躺著姆蘸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芙委。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天狂秦,我揣著相機(jī)與錄音灌侣,去河邊找鬼。 笑死裂问,一個(gè)胖子當(dāng)著我的面吹牛侧啼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堪簿,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼痊乾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了椭更?” 一聲冷哼從身側(cè)響起哪审,我...
    開(kāi)封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虑瀑,沒(méi)想到半個(gè)月后湿滓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體滴须,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年叽奥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扔水。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朝氓,死狀恐怖魔市,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赵哲,我是刑警寧澤待德,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站誓竿,受9級(jí)特大地震影響磅网,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筷屡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一涧偷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毙死,春花似錦燎潮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至再菊,卻和暖如春爪喘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纠拔。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工秉剑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稠诲。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓侦鹏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親臀叙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子略水,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容