iOS坐標系的轉換

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);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容