想要把一個在視圖A上的子視圖的坐標系轉換到視圖B上(或相反)該怎麼做呢?一開始真不懂上一句話的意思,看來最近記憶力和理解力衰退不少QQ簡單來講就是視圖坐標系轉換。
可以不用管下面那個Sad Button唷~黃色是view1,紅色是button1,就以這兩者來和view互動一下吧~
雖然已知有API可以呼叫,但是還是想實際看一下跑出來的結果~
有兩個方法:
- – (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
- – (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;
首先是toView:
NSLog(@"Before: self.view:%@",self.view);
NSLog(@"Before: self.view1:%@",self.view1);
NSLog(@"Before: self.button1:%@",self.button1);
CGRect rect = [self.view1 convertRect:self.button1.frame toView:self.view];
self.button1.frame = rect;
NSLog(@"After: self.button1:%@",self.button1);
執行結果:
接著是fromView:Before: self.view:<UIView: 0x8e6f410; frame = (0 0; 320 568); autoresize = RM+BM; layer = <CALayer: 0x8e5c9d0>>
Before: self.view1:<UIView: 0x8e6fc70; frame = (20 91; 245 200); autoresize = W+H; layer = <CALayer: 0x8e6f370>>
Before: self.button1:<UIButton: 0x8e6c930; frame = (102 126; 123 54); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8e6cc80>>
After: self.button1:<UIButton: 0x8e6c930; frame = (122 217; 123 54); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8e6cc80>>
NSLog(@"Before: self.view:%@",self.view);
NSLog(@"Before: self.view1:%@",self.view1);
NSLog(@"Before: self.button1:%@",self.button1);
CGRect rect = [self.view1 convertRect:self.button1.frame fromView:self.view];
self.button1.frame = rect;
NSLog(@"After: self.button1:%@",self.button1);
執行結果:
Before: self.view:<UIView: 0x8e6f410; frame = (0 0; 320 568); autoresize = RM+BM; layer = <CALayer: 0x8e5c9d0>>
Before: self.view1:<UIView: 0x8e6fc70; frame = (20 91; 245 200); autoresize = W+H; layer = <CALayer: 0x8e6f370>>
Before: self.button1:<UIButton: 0x8e6c930; frame = (102 126; 123 54); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8e6cc80>>
After: self.button1:<UIButton: 0x8e6c930; frame = (82 35; 123 54); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8e6cc80>>
會加減的朋友應該可以從位置知道toView和fromView的差別,以後就可以直接利用囉~
上兩個是以面(Rect)為主角,另有兩個方法是以點(Point)為主角,用法大同小異:
- – (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
- – (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
參考:How does – (CGRect)convertRect:(CGRect)rect toView:(UIView *)view work。
![[iOS] 視圖坐標系轉換1](https://cg2010studio.com/wp-content/uploads/2013/08/ios-e8a696e59c96e59d90e6a899e7b3bbe8bd89e68f9b1.png?w=540)
![[iOS] 視圖坐標系轉換2](https://cg2010studio.com/wp-content/uploads/2013/08/ios-e8a696e59c96e59d90e6a899e7b3bbe8bd89e68f9b2.png?w=540)

隨意留個言吧:)~