判断两个控件在同一个Window上是否有重叠

//对UIView写分类
- (BOOL)intersectWithView:(UIView *)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);
}

添加一个更高级别的UIWindow,目的点击状态栏时让ScrollView滚动到顶部

//.h文件
#import <Foundation/Foundation.h> @interface JGTopWindow : NSObject
+ (void)show;
@end //.m文件
#import "JGTopWindow.h" @implementation JGTopWindow static UIWindow *window_;
+ (void)show
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
window_ = [[UIWindow alloc] init];
window_.frame = [UIApplication sharedApplication].statusBarFrame;
// 窗口默认显示黑色
window_.backgroundColor = [UIColor clearColor];
// UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal
// 窗口默认等级是UIWindowLevelNormal,等级最低,放在最下层,点击手势被拦截,无法被监听到
window_.windowLevel = UIWindowLevelAlert;
// 默认是隐藏的
window_.hidden = NO;
[window_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
});
} + (void)topWindowClick
{
// 主窗口
UIWindow *window = [UIApplication sharedApplication].keyWindow; // 查找主窗口中的所有scrollView
[self findScrollViewsInView:window];
} /**
* 查找view中的所有scrollView
*/
+ (void)findScrollViewsInView:(UIView *)view
{
// 利用递归查找所有的子控件
for (UIView *subview in view.subviews) {
[self findScrollViewsInView:subview];
} if (![view isKindOfClass:[UIScrollView class]]) return; // 判断是否跟window有重叠
if (![view intersectWithView:[UIApplication sharedApplication].keyWindow]) return;
// CGRect windowRect = [UIApplication sharedApplication].keyWindow.bounds;
// CGRect viewRect = [view convertRect:view.bounds toView:nil];
// // 跟window不重叠
// if (!CGRectIntersectsRect(windowRect, viewRect)) return; // 如果是scrollView
UIScrollView *scrollView = (UIScrollView *)view; // 修改offset
CGPoint offset = scrollView.contentOffset;
offset.y = - scrollView.contentInset.top;
[scrollView setContentOffset:offset animated:YES]; // [scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}
@end

判断两个控件在同一个Window上是否有重叠的更多相关文章

  1. form-line 样式 让 两个控件在同一个水平位置

    <div class="row"> <div> <label class="form-inline">参加单位:<in ...

  2. .Net平台Winform两个ComboBox控件绑定同一个数据源

    今天WINFROM编程遇到这么一个问题:是有关WINFORM中两个comboBox控件绑定同一个数据源的问题,在窗体的界面上有两个comboBox,我在Form1_Load中对他们做了数据绑定(具体代 ...

  3. 样式:让div里的两个控件在一行的操作

    table的td里如果放一个text,希望在右侧再放一个按钮,让这两个控件在一行,但是放了之后总是底部不能对齐,这样的话,加上下边这句样式就可以了 position:relative; top:17p ...

  4. Android两个控件叠在一起,如何让被挡住的控件显示出来

    Android两个控件叠在一起,如何让被挡住的控件显示出来 问题 : 两个控件叠在一起,如何让被挡住的控件显示出来? 比如A,B两个控件,A被B挡住,目前A要显示出来,B不能被隐藏,A的高度只有那么一 ...

  5. @Html.CheckBoxFor为何输出两种控件

    在MVC中当使用@Html.CheckBoxFor时表单上会产生两种控件checkbox和hidden,比如: @Html.CheckBoxFor(model => model.IsTop) 对 ...

  6. 9.2.1 .net framework下的MVC 控件的封装(上)

    在写.net core下mvc控件的编写之前,我先说一下.net framework下我们MVC控件的做法. MVC下控件的写法,主要有如下三种,最后一种是泛型的写法,mvc提供的控件都是基本控件. ...

  7. [WPF]使用CheckAccess检测是否在控件的ui线程上执行

    private void Parallel(object sender, RoutedEventArgs e) { Task.Run(() => ChangeColour(Brushes.Red ...

  8. 在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗

    转自 http://www.cnblogs.com/zdxster/archive/2011/01/27/1945868.html 在EOS6的项目中,如果采用VC++开发的ActiveX,那么第一次 ...

  9. Dbgrid控件多重选择的怪问题。BookMarkList,BookMark,使用书签,用的ADOQuery控件。100分送上,急阿!!!请高手帮忙!

    Dbgrid控件多重选择的怪问题.BookMarkList,BookMark,使用书签,用的ADOQuery控件.100分送上,急阿!!!请高手帮忙! ( 积分: 100 )<br />p ...

随机推荐

  1. JVM基本配置与调优

    JVM基本配置与调优 JVM调优,一般都是针对堆内存配置调优. 如图:堆内存分新生代和老年代,新生代又划分为eden区.from区.to区. 一.区域释义 JVM内存模型,堆内存代划分为新生代和老年代 ...

  2. Python面试题之Python反射机制

    0x00 前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = ...

  3. 20145231熊梓宏 《网络对抗》 实验5 MSF基础应用

    20145231熊梓宏 <网络对抗> 实验5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit就相当于是就是渗透攻击,其 ...

  4. wechat4j获取用户昵称乱码修复

    项目对接微信公众号平台时,微信的官方给出的建议是使用wechat4j.官方建议的,自然心里踏实,但实际用起来时发现wechat4j埋有很多雷,最让人心烦意乱的就是中文乱码问题. 之前写过一篇为JAXB ...

  5. 配置ssh秘钥登陆

    环境2台linux服务器:node1 192.168.X.234                               node2 192.168.X.242 演示用node1无密码登陆node ...

  6. ThreadPoolExecutor源码浅析

    目录 初始化 ctl变量 添加任务 addWorker方法 worker实现 执行任务 关闭连接池 参考 初始化 ThreadPoolExecutor重载了多个构造方法,不过最终都是调用的同一个: p ...

  7. 数据结构实习 - problem M 判断平衡二叉树

    writer:pprp date: 20171103 题目描述 给定一棵二叉树的中序和层序输出,判断是否为平衡二叉树的.如果是,输出YES如果不是输出NO. 输入 树结点个数 中序遍历序列 层序遍历序 ...

  8. Python学习札记(十七) 高级特性3 列表生成式

    参考:列表生成式 Note 1.List Comprehensions,即列表生成式,是Python中内置的非常强大的list生成式. eg.生成一个列表:[1*1, 2*2, ..., 10*10] ...

  9. 打开PS是出现“该内存不能为read”是怎么回事?

    打开PS是出现“该内存不能为read”是怎么回事? 答:内存不能为read修复工具可以有效修复计算机运行应用程序时提示:该内存不能为read要终止程序的问题,一般XP系统才会出现这个问题. 指令修复法 ...

  10. Redis可以做哪些事儿?

    Redis可以作为数据库,提供高速缓存,消息队列等功能,这里介绍Redis可以做的其中两件事: 1.提供缓存功能,作为缓存服务器; 2.轻量级的消息队列(MQ)进行使用. /// <summar ...