test1.png
什么是坐標系的轉換?
不同坐標系,控件的View的frame值是不同的,比如上圖的紅色View,以藍色控件為父控件作為坐標系原點,那么它的frame的x = 50,y = 50;如果紅色View以控制器的View為坐標系的原點,那么它的frame的x = 100 + 50,y = 100 + 50;
如果兩個View進行比較,比如是否包含,是否交叉重疊,那么應該轉換成同一坐標系,這樣才可以直接比較;
1.同一坐標系View1和View2之間比較
- 比如都是以控制器的View為父控件,以控制器的View的坐標原點作為參照點
// rect1是否包含rect2,必須是同一個坐標系,返回值是bool
CGRectContainsRect(rect1, rect2)
// 是否有交叉,必須是同一個坐標系,返回值是bool
CGRectIntersectsRect(rect1, rect2)
// 這個點是否在這個矩形框內,返回值是bool
CGRectContainsPoint(rect1, point)
- 注意:同一坐標系兩個View之間比較,rect是控件的frame,不是它的bound
2.不同坐標系View1和View2之間比較
首先了解兩個重要的方法:
view2坐標系 : 以view2的左上角為坐標原點
view1坐標系 : 以view1的左上角為坐標原點
// 顯然這里rect不是View的frame,而是bound
// 讓rect這個矩形框, 從view2坐標系轉換到view1坐標系, 得出一個新的矩形框newRect
// rect和view2的含義 : 用來確定矩形框原來在哪
CGRect newRect = [view1 convertRect:rect fromView:view2];
// 讓rect這個矩形框, 從view1坐標系轉換到view2坐標系, 得出一個新的矩形框newRect
// rect和view1的含義 :用來確定矩形框原來在哪
CGRect newRect = [view1 convertRect:rect toView:view2];
1.確定redView在window中的位置和尺寸
// 這里用`CGRect newRect = [view1 convertRect:rect toView:view2];;
`,這個方法演示
// 方法一:
CGRect newRect = [self.redView convertRect:self.redView.bounds toView:[UIApplication sharedApplication].keyWindow];
// 方法二:
CGRect newRect = [self.redView.superview convertRect:self.redView.frame toView:[UIApplication sharedApplication].keyWindow];
// 方法三:
// 在這里 [UIApplication sharedApplication].keyWindow == nil;
CGRect newRect = [self.redView convertRect:self.redView.bounds toView:nil];
2.確定blueView在window中的位置和尺寸
// 這里用`CGRect newRect2 = [view1 convertRect:rect fromView:view2];
`,這個方法演示
// 注意這里` [[UIApplication sharedApplication].keyWindow`不能寫nil
CGRect newRect = [[UIApplication sharedApplication].keyWindow convertRect:self.blueView.bounds fromView:self.blueView];
3.判斷兩個rect是否有交叉重疊
NSLog(@"%zd", CGRectIntersectsRect(newRect, newRect2));
3.1判斷newRect是否包含newRect2
NSLog(@"%zd", CGRectContainsRect(newRect, newRect2));
3.封裝代碼,判斷兩個View是否有重疊
- (BOOL)intersectWithView:(UIView *)view
{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
CGRect selfRect = [self convertRect:self.bounds toView:window];
CGRect viewRect = [view convertRect:view.bounds toView:window];
return CGRectIntersectsRect(selfRect, viewRect);
}