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

栏目: IOS · 发布时间: 7年前

内容简介:前言本文分享iOS开发中遇到的问题,和相关的一些思考。正文

前言

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

正文

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

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

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

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

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

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

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

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

如下路径,修改设置

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

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

二、NSAssert的断点和symbolic 断点

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

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

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

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

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

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

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

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies];

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

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

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

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

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

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

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

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

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

【问题分析】

从表现来看,是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

链接:https://www.jianshu.com/p/6c964411fc03


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

iGen

iGen

Jean M. Twenge PhD / Atria Books / 2017-8-22 / USD 27.00

A highly readable and entertaining first look at how today’s members of iGen—the children, teens, and young adults born in the mid-1990s and later—are vastly different from their Millennial predecesso......一起来看看 《iGen》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具