多页面悬停控件和如何获得多UIWindow的页面UIWindow

简介: 多页面悬停控件和如何获得多UIWindow的页面UIWindow

若你的app需要悬停一个控件在绝大多数页面上,那么最后的解决方案是:把这个控件做成一个UIWindow,并且设置_statusWindow.windowLevel = UIWindowLevelStatusBar + 1;。注意:这个控件是显示在所有页面中的,除非页面掉用了它的隐藏函数([[PPPlayNoticeView currentNotice] animationHide];),不然它在app那个页面都显示。不过它依赖于app(app就是一个单进程应用,不可能存在多个进程。WKWebView是我见到的iOS唯一一个进程组件,不过通过它起的进程在iOS操作系统中,它虽然和app有通信机制,收到那个进程的数据,但是不受app管辖,app收到它的数据也可能是不实时的,像cookie数据),不会显示在其它app页面中,这个安卓是不一样的。UIAlertView弹窗是系统级别的,可以不依赖于app存在,但是它出来后,不让它消失什么也干不了。不是我们需要控件。

那新问题来了,若这个跨页面的控件显示时,你使用在keywindow上增加图层,可能时增加到这个控件UIWindow的keywindow上。结果是你那个图层显示不出来,只看到一个带透明度的图层。那如何找到当前页面的UIWindow呢?使用下面函数就能找到。

-(UIWindow *)getLevelNormalWindwow
{
    NSArray *windows = [[UIApplication sharedApplication] windows];

    for(UIWindow * tmpWin in windows)
    {
        if (tmpWin.windowLevel == UIWindowLevelNormal)
        {
            UIViewController *result = nil;
            UIView *frontView = [[tmpWin subviews] objectAtSafeIndex:0];
            id nextResponder = [frontView nextResponder];
            
            if ([nextResponder isKindOfClass:[UIViewController class]])
                result = nextResponder;
            else
                result = tmpWin.rootViewController;
            
            NSArray *cv = [result childViewControllers];
            NSLog(@"%@",cv);
            if(cv && [cv isKindOfClass:[NSArray class]] && cv.count > 0)
            {
                return tmpWin;
            }
        }
    }
    return nil;
}

日志打印:

2020-06-18 13:47:08.898734+0800 PinkPig[5900:133486] (
    "<BITBaseTabBarController: 0x7fafb2e154e0>",
    "<PPRoomViewController: 0x7fafb4816800>"
)

当然判断if (tmpWin.windowLevel == UIWindowLevelNormal)就够了,下面多的if(cv && [cv isKindOfClass:[NSArray class]] && cv.count > 0)只是以防万一。你新建的UIWindow不会是UIWindowLevelNormal,不然不知道那个页面在上面呢!,当然你建立rootViewController所在的window时,设置了非UIWindowLevelNormal的值那个判断也要变成你设置成的windowLevel值(就是修改这句if (tmpWin.windowLevel == UIWindowLevelNormal)),不设置windowLevel是默认值UIWindowLevelNormal。

一般是在AppDelegate里设置UIWindow的,如:

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:LoginVC];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
```。
当然我采用的组件化,是在系统模块里设置self.tabBarController的。
具体使用代码:

[self addSubview:self.headDetailView];

当然你可以把这个函数放在静态类或单例中,在那里都能调用该函数,如在调用单例的该函数`[[[UIApplication sharedApplication] keyWindow] addSubview:self.headDetailView];`。

目录
相关文章
|
11月前
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
252 4
|
计算机视觉 C++
基于Qt的简易图片浏览器设计与实现
基于Qt的简易图片浏览器设计与实现
554 1
|
小程序 JavaScript 数据库
微信小程序云开发数据库操作删除记录
微信小程序云开发数据库操作删除记录
279 0
|
缓存 JavaScript API
Vue 3的全新Reactivity API:解锁响应式编程的力量
Vue 3引入了基于Proxy的全新响应式系统,提升了性能并带来了更强大的API。本文通过示例详细介绍了`reactive`、`ref`、`computed`、`watch`等核心API的使用方法,帮助开发者深入理解Vue 3的响应式编程。无论你是初学者还是资深开发者,都能从中受益,构建更高效的应用程序。
181 1
|
安全 大数据 网络安全
网络安全与信息安全:守护数字世界的坚盾在数字化浪潮席卷全球的今天,网络安全已成为维系社会稳定、促进经济发展的重要基石。本文旨在深入探讨网络安全漏洞、加密技术及安全意识等核心议题,通过分享前沿知识与实用策略,助力构建更加安全可靠的网络环境。
【10月更文挑战第8天】 本文聚焦网络安全领域的关键要素,包括安全漏洞的识别与防御、加密技术的演进与应用,以及安全意识的培养与提升。通过对最新研究成果和实际案例的分析,文章揭示了网络安全威胁的多样性和复杂性,强调了综合防护策略的重要性。同时,倡导社会各界共同参与,形成全民网络安全意识,共筑数字空间的安全防线。
306 0
|
机器学习/深度学习 算法 Java
计算机视觉——opencv快速入门(一) opencv的介绍与安装
OpenCV是开源计算机视觉库,支持C++, Python, Java等,用于图像处理、视频分析等。建议使用较早版本如3.4.3,因高版本部分算法需付费。通过Anaconda创建Python虚拟环境来安装,选择合适的Python和OpenCV版本。激活环境后,用`pip`安装`opencv-python`。基本环境配置完成后,通过显示图像的Python代码测试安装是否成功。
计算机视觉——opencv快速入门(一) opencv的介绍与安装
|
存储 前端开发 对象存储
基于jsDelivr+Github给网站如何换个漂亮的字体。
本文介绍了如何为博客自定义字体。首先,从免费字体网站(如100字体下载站)下载字体,然后使用在线工具(如fontformat.com)转换字体格式为eot, woff, woff2, svg和ttf。接着,将字体文件上传至GitHub仓库,利用jsDelivr+GitHub的CDN服务获取文件链接。最后,通过编写@font-face的CSS样式代码,将自定义字体应用到博客中。注意文件名避免使用中文,并确保所有浏览器兼容。
215 2
|
编译器 数据库 索引
数据结构篇:树形数据结构的基本概念及其遍历方法
数据结构篇:树形数据结构的基本概念及其遍历方法
470 0
|
机器学习/深度学习 算法 搜索推荐
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
692 0
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
下一篇
开通oss服务