「 iOS知识小集 」2018 · 第 42 期

原文链接

上周公众号发布的以下文章:

本期知识小集的主要内容包括:

  • 使用 Named UIColor
  • Diff:/Podfile.lock NO such file or directory
  • iOS 中的 GZIP 压缩
  • 使用 CaseIterable 获取枚举的所有 case
  • 不可或缺的背景色

使用 Named UIColor

从 XCode 9 开始,我们可以在工程中创建 named color,并在代码或 Storyboard 中使用。要创建 named color,只需要进入 Assets.xcassets 中,点击右键,出现图 1 的菜单,选择 New Color Set,

然后编辑 named color 的名称和色值等信息,如图 2 所示。

在代码中,我们可以直接使用 UIColor(name: "Test")来使用,如图 3 所示。

扫描二维码关注公众号,回复: 4629651 查看本文章

Diff:/Podfile.lock NO such file or directory

作者: Lefe_x

Pod install 后,运行项目后发现报错,错误提示如图所示。按提示看了下 Podfile.lock 是存在的。试了各种办法,都没有解决(删除 pods 文件夹,重新安装,都不好使)。无奈之下,看了下文件的路径。发现文件路径错了,XXX/Pods/Pods/Target Support Files/xxx,发现文件路径多了个 Pods。这个路径我并没有设置,是 Pod 自己管理的。最后发现在下图的位置中可以配置路径,把这个路径修改成正确的地址就可以了:

iOS 中的 GZIP 压缩

作者:这个汤圆没有馅

当项目中与后端接口交互涉及到大量数据信息的时候,为了提升响应速度需要对传输的数据进行压缩,压缩成功后将 data 转化为 string 传给服务器。

关于 iOS 端的 GZIP 压缩,这是我目前在 github 上找到的 star 数最多的一个:t.cn/RUBP1Le

GZIP 支持 cocoapods,如果手动导入的话,记得在 Targets--Build Phases--Link Binary With Libraries 中添加 libz.1.2.5.tbd。

模拟一万条简单的数据,看看压缩前后数据大小变化。如下图。

经过 GZIP 压缩后,字节量缩小幅度很大。但是压缩后的 data 是无法通过 - (nullable instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding; 这个方法得到string的。

这个时候我们再来看 java 中对于压缩的数据是如何解压缩的,java 代码如下图。

其中有一行代码为

byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
复制代码

说明 java 是对 base64 的string 进行解压缩的,也就是说我们在进行 data 压缩后,需要传 base64 的string 给服务器。那么只需要加一行代码

[zipData base64EncodedStringWithOptions:0];
复制代码

使用 CaseIterable 获取枚举的所有 case

在写 Swift 代码时,可能需要获取枚举的所有 case,在之前的版本中,我们可能需要自己来实现一个静态方法 allCases,如下代码所示:

enum CompassDirection {
    case north, south, east, west

    static let allCases = [north, south, east, west]
}
复制代码

而在 Swift 4.2 中,标准库为我们提供了 CaseIterable 协议,可以实现这个需求,如下代码所示:

enum CompassDirection: CaseIterable {
    case north, south, east, west
}

print("There are \(CompassDirection.allCases.count) directions.")
// Prints "There are 4 directions."
let caseList = CompassDirection.allCases
                               .map({ "\($0)" })
                               .joined(separator: ", ")
// caseList == "north, south, east, west"
复制代码

实现 CaseIterable 的枚举在编译器会自动合成 allCases 方法,且 allCases 数组中的元素按 case 声明的顺序。不过如果枚举中的关联值或者 @available 属性,则需要自己重写 allCases,如下代码所示:

enum CompassDirection: CaseIterable {

    case north, south, east
    case west(Int)

    static var allCases: [CompassDirection] {
        return [north, south, east, west(0)]
    }
}

print("There are \(CompassDirection.allCases.count) directions.")
// Prints "There are 4 directions."
let caseList = CompassDirection.allCases
    .map({ "\($0)" })
    .joined(separator: ", ")
// caseList == "north, south, east, west(0)"
复制代码

不可或缺的背景色

作者:Vong_HUST

最近遇到两个和背景色有关的坑,和大家一起分享下。第一个页面 A push到页面 B 时,会莫名卡顿。一开始还以为是代码里有耗时操作,然后就一行行屏蔽,屏蔽到什么代码都没有了,还是会卡顿,现在大概就如下图所示。

觉得不可思议,因为 push 到其它页面都不会发生这种情况,最后比对代码发现,其它页面比 B 页面唯一多的一个操作就是设置了 vc.view.background,只要设置了背景色不为 nil 且不为 [UIColor clearColor],就不会出现图中的卡顿感。

另外一种情况就是,如果 collectionView 和 vc.view 背景色都是 nil 或者 clearColor,会出现一种现象就是 collectionView 只能响应有内容区域的点击事件,比如一个 (0, 0, 100, 100) 的 cell 上有一个 (0, 0, 20, 100)的 button,则只有按钮区域是能点击响应事件,其它空白区域(20, 0, 80, 100)的区域点击是不会触发 didSelect 回调的,一旦设置了 vc.view 的背景色,就会恢复正常。

以上两种现象都是由于背景色没有处理妥当,导致页面卡顿或无法响应事件,只要设置了背景色,即可恢复。具体原因还不清楚,有知道的老哥们可以在评论中指点一波~

注:提拉拉拉就是技术宅 大大对此的解释是:不是卡顿,动画本来就是这样子的,后面的vc只推过去一点点。我曾经做过一个app,背景是spritekit的特效,然后整个app 所有vc 都是模态窗口盖在特效上面,背景颜色全部都是clear ,push的动画本身就是这个样子的。

关注我们

欢迎关注我们的公众号:iOS-Tips,也欢迎加入我们的群组讨论问题。可以公众号留言 iosflutter 等关键词获取入群方式。

猜你喜欢

转载自juejin.im/post/5c1e26d9e51d45585838d623
今日推荐