UIWindow的那些坑文章

问题背景

起因是接手了一个状态栏自定义view的UI显示问题,原本以为只是一个简答的UI问题,没想到在自测以及验证当中,发掘出了一系列UIWindow的各种坑

先说需求

先简单说一下产品和交互需求
1.客服的会话如果没有处理,在第X分钟会收到即将超时提醒;
2.当有即将超时提醒的时候,会持续显示在状态栏上,而这个显示是全局的,基本上除了登录页面,App每个页面都会在状态栏显示;
3.当用户点击状态栏的时候,会跳转到客服列表页面,并且能够返回到之前的页面;

技术实现

iOS要在状态栏上显示自定义视图,唯一方式是以UIWindow的方式覆盖在上面,然后加入相应的事件处理

引发的各种坑

如果熟悉iOS UI机制,可以知道UIWindow是一个层级比较高的特殊窗口,所有的UIView必须附加在某一个UIWindow上。而我们App启动的时候,会初始化一个UIWindow的主视图,为了便于区分,这边叫做MainWindow,而我们的状态栏自定义视图叫做StatusBarWindow,接着说说坑

  1. 首先是KeyWindow,这个是我们开发当中经常使用到的,比如添加一个全局视图或者不好拿到当前视图时我们通常都会想到直接添加到KeyWindow上。而KeyWindow恰恰有可能并不是MainWindow,比如我们自定义的StatusBarWindow,就会出现很诡异的问题,各种视图被添加到了状态栏上;
  2. 一些添加MainWindow上的UIView,当我们跳转到客服列表的时候,直接被带到了客服列表页面,导致视图显示错乱;
  3. 存在其他UIWindow的情况,没办法跳转到客服列表页面,因为当前的MainWindow被覆盖了。并且将其他UIWindow resignKeyWindow之后,我们自定义的StatusBarWindow有可能变成KeyWindow;
  4. 如果页面当前有Presented的Controller,点击没办法跳转跳转到客服列表页面;
  5. UIAlertView神一般的存在,即使UIWindowLevelStatusBar的级别的Window也是无法点击
  6. 如果KeyWindow不是主Window的话会引起主Window的视图长按,摇一摇等事件失效

解决方案

  1. 监听KeyWindow的状态,防止自定义的StatusBarWindow成为KeyWindow;
  2. 在跳转时需要处理以上所列的各种异常情况,清除MainWindow上跟主视图无关的其他Sub Views;
  3. 最好的解决方案是和产品讨论其他更友好的交互方式,摒弃这种不科学的展示和交互行为;

开发原则

  1. 尽量避免使用UIWindow;
  2. 尽量避免将自定义的View添加到KeyWindow上,如果需要最好加到MainWindow;

你可能感兴趣的:(UIWindow的那些坑文章)