上周公众号发布的以下文章:
本期知识小集的主要内容包括:
- 使用 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 所示。
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,也欢迎加入我们的群组讨论问题。可以公众号留言 ios
、flutter
等关键词获取入群方式。