iOS oc判断两个UI控件是否有重叠(交互)

在iOS 开发中 我们有时需要判断两个UI控件是否有重合而来处理一些逻辑 举个简单的例子 看下图图片选择器 上面是一个删除按钮  此刻就需要判断 当前点击的删除按钮和当前哪个图片有重叠交集 就去删除哪张图片,以下就介绍一下常用的判断两个控件是否有重叠的方法.

iOS oc判断两个UI控件是否有重叠(交互)_第1张图片

1 //两个控件在相同的父视图上 以下为例子

iOS oc判断两个UI控件是否有重叠(交互)_第2张图片

//两个控件都是在self.view上以(0.0)为原点

UIView*view1 = [[UIViewalloc]initWithFrame:CGRectMake(0,0,100,100)];

view1.backgroundColor= [UIColoryellowColor];

self.yellowView= view1;

[self.viewaddSubview:view1];

UIView*view2 = [[UIViewalloc]initWithFrame:CGRectMake(0,180,100,100)];

view2.backgroundColor= [UIColorredColor];

self.redView= view2;

[self.viewaddSubview:view2];

//判断两个控件是否有交互:(前提是在同一个父控件上面)

BOOLisMutul =CGRectIntersectsRect(self.whiteLabel.frame,self.blackLabel.frame);

//NSLog(@"isMutul---%d",isMutul); 有交互返回1   没重叠 返回0 


// 2 第二种情况   两个控件不在同一个父控件上面  这时我们就需要把这两个父控件转换为以当前主窗口为坐标原点 判断白色按钮和黑色按钮是否有重叠(黑色label在黄色view上    白色label在红色view上面)



iOS oc判断两个UI控件是否有重叠(交互)_第3张图片

@interfaceViewController(){

CGRect_whiteRect;

CGRect_blackRect;

}

@property(nonatomic,weak)UIView*yellowView;

@property(nonatomic,weak)UIView*redView;

@property(nonatomic,weak)UILabel*whiteLabel;

@property(nonatomic,weak)UILabel*blackLabel;

UIView*view1 = [[UIViewalloc]initWithFrame:CGRectMake(0,0,100,100)];

view1.backgroundColor= [UIColoryellowColor];

self.yellowView= view1;

view1.alpha=0.5;

[self.viewaddSubview:view1];

UILabel*label1 = [[UILabelalloc]initWithFrame:CGRectMake(0,70,80,30)];

label1.text=@"黑色";

label1.backgroundColor= [UIColorblackColor];

label1.font= [UIFontsystemFontOfSize:15];

label1.textAlignment=NSTextAlignmentLeft;

self.blackLabel= label1;

[self.yellowViewaddSubview:label1];

UIView*view2 = [[UIViewalloc]initWithFrame:CGRectMake(0,80,100,100)];

view2.backgroundColor= [UIColorredColor];

view2.alpha=0.5;

self.redView= view2;

[self.viewaddSubview:view2];

UILabel*label2 = [[UILabelalloc]initWithFrame:CGRectMake(0,10,80,30)];

label2.backgroundColor= [UIColorwhiteColor];

label2.text=@"白色";

label2.font= [UIFontsystemFontOfSize:15];

label2.textAlignment=NSTextAlignmentLeft;

self.whiteLabel= label2;

[self.redViewaddSubview:label2];

//两个控件在不同的父视图上需要把两个控件的坐标统一转换为以window为远点的坐标轴

//方法1 一般用第一种方法

//主窗口

UIWindow*keyWindow = [UIApplicationsharedApplication].keyWindow;

//以主窗口左上角为坐标原点,计算self的矩形框

//CGRect whiteRect = [keyWindow convertRect:self.whiteLabel.frame fromView:self.redView];

//CGRect blackRect = [keyWindow convertRect:self.blackLabel.frame fromView:self.yellowView];

//方法2

// toView:nil写nil默认就表示window

CGRect whiteRect = [self.whiteLabelconvertRect:self.whiteLabel.boundstoView:nil];

_whiteRect= whiteRect;

CGRect blackRect = [self.blackLabelconvertRect:self.blackLabel.boundstoView:nil];

_blackRect= blackRect;

BOOLisjh =CGRectIntersectsRect(_whiteRect,_blackRect);

NSLog(@"isjh---%zd", isjh); 有交互返回1  没有返回0

谢谢大家   希望对你有帮组  如果对你有帮组请点个爱心吧   谢谢!

你可能感兴趣的:(iOS oc判断两个UI控件是否有重叠(交互))