iOS开发中一些"有挑战"的问题

本文源自这里, 另外还有姊妹篇iOS开发中一些"有趣"的问题

目录

问题1: navigation push时隐藏的Tarbar怎么又回来了

问题描述

模拟类似Present的效果, 实现的思路如下

通过自定义Presented ViewController进入动画, 然后切换window的rootViewController到Presented ViewController

但是这种方式(先不谈论这种方式的方式是否合理和规范)会导致已隐藏的tabbar又显示出来的问题

问题发生在这样的条件下

  • 原先的rootViewController是一个UITabBarController

  • 每个Tab的子ViewController是NavigationController

  • push一个ViewController到NavigationController, 并且"hidesBottomBarWhenPushed = YES"

  • 切换rootViewController到Presented ViewController, 然后再切换回之前的UITabBarController

问题分析

在rootViewController是UITabBarController的情况下, push ViewController到NavigationController时, 配置"hidesBottomBarWhenPushed = YES"用来隐藏Tabbar

但是此时隐藏Tabbar的配置并不是存储在push的ViewController里, 而是与push动作相关联(这段是我的推测, 并没有源码做论证)

所以将rootViewController切换回之前的UITabBarController后, Tabbar就又显示出来了

问题解决

其实这个问题与刚开始的实现思路有关系, 这种模拟Present效果的方式并不常见, 所以必要性有待商榷, 但是这样也算是暴露出了一个iOS UI开发的问题

解决的思路是延续Apple的方式, 即push一个空的ViewController, 再pop出来, 这样Tabbar就与push动作又发生了关联, 由此Tabbar就又被隐藏了起来

UIViewController *dumbViewController = [[UIViewController alloc] init];
[navigationController pushViewController:dumbViewController animated:NO];
[navigationController popViewControllerAnimated:NO];

问题2: 莫名消失的MBProgressHUD

问题描述

在点击Actionsheet的选项后, 弹出一个覆盖全屏的spinner(spinner使用的是第三库MBProgressHUD, 添加到keyWindow上), 同时ActionSheet也自动隐藏起来(因为点击选项了)

但是spinner弹出之后, 又立马迅速地消失了, 而如果再次弹出Actionsheet时, spinner又会随着Actionsheet一起显示出来

问题分析

从现象来看, 其实spinner并没有销毁, 而只是隐藏了起来, 否则不会随着Actionsheet第二次弹出而弹出

问题代码的实现是这样的

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // show wait spinner, add it to keywindow
}

加载spinner到keywindow是在Actionsheet的clickedButtonAtIndex delegate里, 所以事件的时序是这样的

加载spinner到keywindow -> 隐藏Actionsheet

由于Actionsheet也是加载到底层的window上, 所以先前显示的spinner可能会随着Actionsheet的隐藏而隐藏起来了

问题解决

为了避免Actionsheet隐藏时带来的干扰, 我们希望事件的时序是这样的

隐藏Actionsheet -> 加载spinner到keywindow

很简单, 只需要用新的Actionsheet的delegate方法didDismissWithButtonIndex来替代clickedButtonAtIndex

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    // show wait spinner, add it to keywindow
}

问题3: 奇怪的DAContextMenuTableViewController只在iOS7工作不正常

问题描述

要实现在cell上侧滑后, 出现选项按钮的效果

ios_difficulty_problems_01.png

这里使用了第三方库DAContextMenuTableViewController

但是在使用shouldDisableUserInteractionWhileEditing选
项后, 侧滑cell后不能响应事件

并且此问题只出现在iOS7版本中, 而iOS8+系统并不存在该问题

问题分析

这里牵涉到HitTest的问题, 原理和概念参考这里

不能响应事件, 说明事件被拦截了, 即在要响应事件的view上层有其他view, 而这个其他view拦截了事件

通过打印UITableView的subViews, 发现确实存在这样的中间view

UITableView(1级)

----UITableViewWrapperView(2级)

--------UITableViewCell(3级)

--------UITableViewCell(3级)

----UIView(2级)

----UIImageView(2级)

UITableView是肯定能响应事件的, 而UITableViewCell并没有接收到事件, 那很可能是UITableViewWrapperView将事件拦截了

查看DAContextMenuTableViewController源码发现这里确实有问题

for (UIView *view in self.tableView.subviews) {
    if ((view.gestureRecognizers.count == 0) && view != self.cellDisplayingMenuOptions && view != self.overlayView) {
        view.userInteractionEnabled = NO;
    }
}

打印发现在iOS7系统中UITableViewWrapperView的view.gestureRecognizers.count=0

而在iOS8+系统中UITableViewWrapperView的view.gestureRecognizers.count>0

所以在iOS7中UITableViewWrapperView的userInteractionEnabled=NO, 所以事件就被UITableViewWrapperView拦截了而没有传递到cell

究其原因, 是不同iOS版本的内部实现差异导致的, 同时, 这种依赖于Apple平台的第三方库也要需要随着iOS的更新而更新

问题解决

条件语句不使用view.gestureRecognizers.count, 而是通过其subViews类型来判断当前view是否是UITableViewWrapperView

for (UIView *view in self.imTable.subviews) {
    if (!(view.subviews.count > 0 && [[view.subviews firstObject] isKindOfClass:[UITableViewCell class]])) {
        view.userInteractionEnabled = NO;
    }
}

更多文章, 请支持我的个人博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 想起夏目对自己家的路的记忆,记不清了,但是有印象,因为记忆很美好现实很残酷所以不想想起也忘得差不多了,但是后来想起...
    心不尘封阅读 330评论 0 0
  • 传送门 https://pintia.cn/problem-sets/994805260223102976/pro...
    Rush的博客阅读 1,898评论 0 0
  • 年前,小学同学搞聚会,一个从她家到我家十分钟的伙伴说一起去聚会,然后晚上到我家过夜,一起聊聊天,也好久没见了。说好...
    给我来杯橙汁儿阅读 244评论 0 0
  • 作者 姜苏 12 知道他们没收入 蒋海诺午后从床上起来,先是坐在床边出了会神,想着昨天和同学一同去工商局的情...
    姜苏阅读 163评论 0 0