iOS开发笔记(十)— Xcode、UITabbar、特殊机型问题分析

前言

本文分享iOS开发中遇到的问题,和相关的一些思考。

正文

一、Xcode10.1 import头文件无法索引

【问题表现】如图,当import头文件的时候,索引无效,无法联想出正确的文件;



【问题分析】通过多个文件尝试,发现并非完全不能索引头文件,而是只能索引和当前文件在同级目录的头文件;
有点猜测是Xcode10.1的原因,但是在升级完的半年多时间里,都没有出现过索引。
从已有的知识来分析,很可能是Xcode的头文件搜索路径有问题,于是尝试把工程文件下的路径设置递归搜索,结果又出现以下问题:

【问题解决】在多次尝试无效之后,最终还是靠Google解决该问题。
如下路径,修改设置
Xcode --> File --> Workspace Settings --> Build System --> Legacy Build System

二、NSAssert的断点和symbolic 断点

【问题表现】NSAssert是常见的断言,可以在debug阶段快速暴露问题,但是在触发的时候无法保持上下文;
【问题分析】NSAssert的本质就是抛出一个异常,可以通过Xcode添加一个Exception Breakpoint:

如下,便可以NSAssert触发时捕获现场。


同理,在Exception Breakpoint,还有Smybolic Breakpoint较为常用。
以cookie设置接口为例,以下为一段设置cookies的代码
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies];
但是有时候设置cookies的地方可能较多,此时可以添加一个Smybolic Breakpoint并设置符号为cookies。
如下,可以看到所有设置cookies的接口:

三、.m文件改成.mm文件后编译失败

【问题表现】Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
出错代码行: typedef void(^SSDataCallback)(NSError *error, id obj);
手动给参数添加 nullable的声明并无法解决。

【问题分析】
首先确定的是,这个编译失败实际上是一个warning,只是因为工程设置了把warning识别为error;
其次.m文件可以正常编译,并且.m文件也是开启了warning as error的设置;而从改成.mm就报错的表现和提示log来看,仍然是因为参数为空的原因导致。

【问题解决】
经过对比正常编译的.mm文件,找到一个解决方案:
1,添加NS_ASSUME_NONNULL_BEGIN在代码最前面,NS_ASSUME_NONNULL_END在代码最后面;
2、手动添加_Nullable到函数的参数;
typedef void(^SSDataCallback)(NSError * _Nullable error, id _Nullable obj);

四、UITabbar疑难杂症

问题1、batItem的染色异常问题

【问题表现】添加UITabBarItem到tabbar上,但是图片会被染成蓝色;
【问题分析】tabbar默认会帮我们染色,所以我们创建的UITabBarItem默认会被tinkColor染色的影响。
解决办法就是添加参数imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal,这样UITabBarItem的图片变不会受到tinkColor影响。

        UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"商城" image:[UIImage imageNamed:@"tabbar_item_store"] selectedImage:[[UIImage imageNamed:@"tabbar_item_store_selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];

问题2、tabbar的背景色问题

【问题表现】设置tabbar的背景色是0xFFFFFF的白色,但是实际的效果确是灰白色,并不是全白色;
【问题分析】tabbar默认是透明的(属性translucent),会对tabbar下面的视图进行高斯模糊,然后再与背景色混合。
【问题解决】
1、自由做法,addSubview:一个view到tabbar上,接下来自己绘制4个按钮;(可操作性强,缺点是tabbar的逻辑需要自己再实现一遍)
2、改变tabbar透明度做法,设置translucent=YES,再修改背景色;(引入一个巨大的坑,导致UITabbarViewController上面的子VC的self.view属性高度会变化!)
3、空白图做法,把背景图都用一张空白的图片替代,如下:(最终采纳的做法)

    self.tabBar.backgroundImage = [[UIImage alloc] init];
    self.tabBar.backgroundColor = [UIColor whiteColor];

问题3、tabbar顶部的线条问题

【问题表现】UITabbar默认在tabbar的顶部会有一条灰色的线,但是并没有一个属性可以修改其颜色。
【问题分析】从Xcode的工具来看,这条线是一个UIImageView:



再从UITabbar的头文件来看,这条线的图片可能是shadowImage。
【问题解决】将shadowImage用一张空白的图片替代,然后自己再添加想要的线条大小和颜色。

    self.tabBar.shadowImage = [[UIImage alloc] init];
    UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tabBar.width, 0.5)];
    lineView.backgroundColor = [UIColor colorWithHexString:@"e8e8e8"];
    [self.tabBar addSubview:lineView];

五、特殊机型出现的异常现象

1、iOS 11.4 充电时无法正常获取电量

【问题表现】在某个场景需要获取电池,于是通过以下addObserverForName:UIDeviceBatteryLevelDidChangeNotification的方式监听电量的变化,在iOS 12的机型表现正常,但是在iOS 11.4的机型上会出现无法获取电量的原因。

    void (^block)(NSNotification *notification) = ^(NSNotification *notification) {
        SS_STRONG_SELF(self);
        NSLog(@"%@", self);
        self.batteryView.width = (self.batteryImageView.width - Padding_battery_width) * [UIDevice currentDevice].batteryLevel;
    };
    //监视电池剩余电量
    [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceBatteryLevelDidChangeNotification
                                                      object:nil
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:block];

【问题分析】从电量获取的api开始入手分析,在获取电量之前,需要显式调用接口
[UIDevice currentDevice].batteryMonitoringEnabled = YES;
于是点击batteryMonitoringEnabled属性进入UIDevice.h,发现有个batteryState属性,里面有一个状态是充电UIDeviceBatteryStateCharging,但是对问题并无帮助;
点击UIDeviceBatteryLevelDidChangeNotification发现还有一个通知是UIDeviceBatteryStateDidChangeNotification,猜测可能是充电状态下的回调有所不同;
【问题解决】最终通过添加新通知的监听解决。该问题并不太难,但是养成多看.h文件相关属性的习惯,还是会有好处。

    [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceBatteryStateDidChangeNotification
                                                      object:nil
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:block];

2、iOS 10.3的UILabel富文本排版异常

【问题表现】有一段文本的显示需要设置首行缩进,所以用的富文本添加段落属性的方式;但是在iOS 10.3的6p机型上出现异常现象,如下:
测试文本:contentStr=@"一年佛山电脑放山东难道是防空洞念佛"
如下,最后的字符没有显示完全。
实现方式是计算得到富文本,然后赋值给UILabel,再调用-sizeToFit的接口。


以上的问题仅在一行的时候出现异常,两行又恢复正常。

【问题分析】
从表现来看,是sizeToFit的时候宽度结算出错;通过多次尝试,发现是少计算了大概两个空格的距离,也即是首行缩进的距离。
【问题解决】
方法1、去除首行缩进,每行增加两个空格;
方法2、一行的时候,把宽度设置到最大;
如何判断1行的情况,可以用以下的代码简短判断

    if (self.contentLabel.height < self.contentLabel.font.lineHeight * 2) { // 一行的情况
        self.contentLabel.width = self.width - 40;
    }

总结

日常开发遇到的问题,如果解决过程超过10分钟,我都会记录下来。
这些问题有的很简单,仅仅是改个配置(如第一个Xcode索引问题),但是在解决过程中还是走了一些弯路,因为完全没想过可能会去改Workspace setting,都是在Build setting修改进行尝试。
还有些问题纯粹是特定现象,比如说特殊机型问题,只是做一个备忘和提醒。

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

推荐阅读更多精彩内容

  • 技术无极限,从菜鸟开始,从源码开始。 由于公司目前项目还是用OC写的项目,没有升级swift 所以暂时SDWebI...
    充满活力的早晨阅读 12,551评论 0 2
  • iOS开发规范 目录 编写目的 制定开发规范,可以在团队内部形成统一的开发习惯,减少协作的理解成本。此开发规范主要...
    Lorne_coder阅读 543评论 0 4
  • 我愿做你的周幽王, 倾尽天下 乱世繁华 予你一场盛世烟花, 烽火狼烟 兵马仓皇 却只为搏你一笑风华, 我为你担了昏...
    王春華阅读 241评论 0 0
  • 两个世界 他是一个哲学家,至少他是...
    生财小面馆阅读 160评论 0 0
  • 2018年06月26日刘博林日精进打卡 姓名:刘博林 公司:扬州市方圆建筑工程有限公司 349期(南京)《六项精进...
    Polin1990阅读 238评论 0 0