AG亚游集团 >iOS开发

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

2019-01-09 11:01 编辑: AG亚游集团suiling 分类:iOS开发 来源:落影loyinglin

前言

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

正文

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

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

image.png

【问题分析】通过多个文件尝试,发现并非完全不能索引头文件,而是只能索引和当前文件在同级目录的头文件;

有点猜测是Xcode10.1的原因,但是在升级完的半年多时间里,都没有出现过索引。

从已有的知识来分析,很可能是Xcode的头文件搜索路径有问题,于是尝试把工程文件下的路径设置递归搜索,结果又出现以下问题:

image.png

【问题解决】在多次尝试无效之后,最终还是靠Google解决该问题。

如下路径,修改设置

Xcode --> File --> Workspace Settings --> Build System --> Legacy Build System

image.png

二、NSAssert的断点和symbolic 断点

【问题表现】NSAssert是常见的断言,可以在debug阶段快速暴露问题,但是在触发的时候无法保持上下文;

【问题分析】NSAssert的本质就是抛出一个异常,可以通过Xcode添加一个Exception Breakpoint:

image.png

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

image.png

同理,在Exception Breakpoint,还有Smybolic Breakpoint较为常用。

以cookie设置接口为例,以下为一段设置cookies的代码

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies];

但是有时候设置cookies的地方可能较多,此时可以添加一个Smybolic Breakpoint并设置符号为cookies。

如下,可以看到所有设置cookies的接口:

image.png

三、.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:

image.png

再从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的接口。

image.png

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

image.png

【问题分析】

从表现来看,是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修改进行尝试。

还有些问题纯粹是特定现象,比如说特殊机型问题,只是做一个备忘和提醒。

作者:落影loyinglin

链接:/www0686jianshu0686com/p/6c964411fc03

搜索CocoaChina微信公众号:CocoaChina
微信扫一扫
订阅每日移动开发及APP推广热点资讯
公众号:
CocoaChina
上一篇:iOS可视化动态绘制八种排序过程(Swift版)

相关资讯

我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0

综合评论

相关帖子

sina weixin mail 回到顶部
保险保障基金向安邦增资608亿 增后注册资本619亿 港媒:中国在喜马拉雅山采矿 中印边界或成另一个南海 国内科技公司争相IPO 盈利能力有待考验 高通新5G芯片解决大难题:缩小尺寸 装进手机 李源一自解进球:这是运气 我每年都能进神仙球 台警驻守蔡父墓园嫌不够 台当局还要24小时监控 这部年度震撼大片正式上映 预售额破6000万 小伙在病房向白血病女友求婚:三生三世不离不弃 皇马后防有个定时炸弹!西甲+欧冠历史黄牌大王 888车牌抢不到?黑客入侵选号系统3年买上海2套房 京东旗下子公司向物流地产开发商ESR投资3.06亿美元 AI芯片淘金热: 一场耐力持久的追逐赛
大阪黄金挑战赛 中国女子接力队两挫日本夺冠 抖音命门:广告业务在监管中夹缝求生 美国资本设备订单连续第三个月增长 商业投资仍强劲 北理工将入驻张家口 设国防科技创新中心等五板块 长沙城管用水枪执法成网红:浇路边摊贩火炉(图) 阿富汗东部发现IS埋尸坑 至少10名平民遗体被发掘 代表谈“投资不过山海关”:法治是重要营商环境 新华社评论员:厉行法治 常修政德 杭州城中村改造原总指挥受贿968万 获刑10年半 特斯拉为降成本不愿增加传感器?马斯克否认 重庆“孤儿”母亲杀夫贩毒 爷奶外婆过世外公不要 安倍31日取消例行内阁会议进入休假模式被指罕见
火箭5年9000万留下饼皇 新合同不包含任何选项 B站赴美IPO 八成收入靠游戏如何破壁二次元盈利? 恒大亚冠首轮下午5点开球 比赛仍在天河进行 今年赴日赏樱中国游客将达60万人 预计消费80亿元 日本反垄断机构再次搜查亚马逊办公室 中甲-马里一击制胜 梅州主场1-0延边取赛季首胜 天津和平区人大常委会副主任姚增顺被查 以牙还牙 日本拟告知WTO将启动对美反关税措施 毅腾官方声明澄清迁移主场:并没有这样的打算 卖什么利润大不压货 最近开什么店比较好 适合女性开的十五种店 自己在家怎么挣钱 AG亚游集团