在iOS 开发中 我们有时需要判断两个UI控件是否有重合而来处理一些逻辑 举个简单的例子 看下图图片选择器 上面是一个删除按钮 此刻就需要判断 当前点击的删除按钮和当前哪个图片有重叠交集 就去删除哪张图片,以下就介绍一下常用的判断两个控件是否有重叠的方法.
1 //两个控件在相同的父视图上 以下为例子
//两个控件都是在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上面)
@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
谢谢大家 希望对你有帮组 如果对你有帮组请点个爱心吧 谢谢!