@interface AppDelegate ()
@end
@implementation AppDelegate
UIWindow * topWindow;//设置一个全局变量
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
//这里把topWindow设置在状态栏的位置。并设置放置最外层。加入一个手势。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
topWindow = [[UIWindow alloc]init];
topWindow.frame = [UIApplication sharedApplication].statusBarFrame;
topWindow.backgroundColor = [UIColor redColor];
topWindow.windowLevel = UIWindowLevelAlert;
topWindow.hidden = NO;
[topWindow addGestureRecognizer:[[UIGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
});
return YES;
}
- (void)topWindowClick{
UIWindow * window = [UIApplication sharedApplication].keyWindow;
[self findScrollViewsInView:window];
}
- (void)findScrollViewsInView:(UIView *)view{
for (UIView * subView in view.subviews) {//用个递归找到scrollView;
[self findScrollViewsInView:subView];
}
if (![view isKindOfClass:[UIScrollView class]]) return;
UIView * windowView = [UIApplication sharedApplication].keyWindow;
BOOL interSect = CGRectIntersectsRect(windowView.bounds,[windowView convertRect:view.bounds fromView:nil] );
if (!interSect) return;//如果有多个页面。这里判断拿到的页面是否是当前显示页面。如果是则滚动到顶部,否则跳过。
UIScrollView * scrollView = (UIScrollView *)view;
[scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}
***************************以下方法用于判断一个视图是否与当前视图重叠(该方法建议放在UIView的扩展中)**********************
- (BOOL)keyWindowinterSectWithView:(UIView *)view{
UIWindow * window = [UIApplication sharedApplication].keyWindow;
CGRect selfRect = [self convertRect:self.bounds fromView:window];
CGRect viewRect = [view convertRect:view.bounds toView:window];
return CGRectIntersectsRect(selfRect, viewRect);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结