相关方法如下:
- (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];
网友评论