坐标系转换

相关方法如下:

  • (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;
  • (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;
  • (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
  • (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;

判读两个控件是否有重叠

一.当两个控件共用一个父控件的时候,直接通过如下示例判断
CGRectIntersectsRect(view1.frame, view2.frame)

判断的2个函数如下

  • bool CGRectContainsRect(CGRect rect1, CGRect rect2)
    • 判断rect1是否包含了rect2
  • bool CGRectIntersectsRect(CGRect rect1, CGRect rect2)
    • 判断rect1和rect2是否有重叠
    • 注意:rect1和rect2要在同一个坐标系,比较结果才准确
二.当两个控件父控件不相同的时候

需要先将两个控件矩形框转换到同一个坐标原点下,再将转换后的矩形框传到如下方法中:

CGRectIntersectsRect(rect1, rect2)

转换坐标系相关方法总结

view2坐标系 : 以view2的左上角为坐标原点
view1坐标系 : 以view1的左上角为坐标原点

CGRect newRect = [view1 convertRect:rect fromView:view2];
// 让rect这个矩形框, 从view2坐标系转换到view1坐标系, 得出一个新的矩形框newRect
// rect和view2的含义 : 用来确定矩形框原来在哪

CGRect newRect = [view1 convertRect:rect toView:view2];
// 让rect这个矩形框, 从view1坐标系转换到view2坐标系, 得出一个新的矩形框newRect
// rect和view1的含义 :用来确定矩形框原来在哪

获得一个控件在window中的位置和尺寸

  • 以获得redView在window中的位置和尺寸为例
CGRect newRect = [[UIApplication sharedApplication].keyWindow convertRect:redView.bounds fromView:redView];
CGRect newRect = [[UIApplication sharedApplication].keyWindow convertRect:redView.frame fromView:redView.superview];
CGRect newRect = [redView convertRect:redView.bounds toView:[UIApplication sharedApplication].keyWindow];
CGRect newRect = [redView.superview convertRect:redView.frame toView:[UIApplication sharedApplication].keyWindow];
CGRect newRect = [redView convertRect:redView.bounds toView:nil];
CGRect newRect = [redView.superview convertRect:redView.frame toView:nil];

你可能感兴趣的:(坐标系转换)