前言

ios 开发过程中,难免会用到一些三方库,这里介绍一下 swift 开发过重中常用的自适应布局 SnapKit 和 图片异步加载结构 Kingfisher 的运用

其间 Kingfisher 便是比较知名的 onevcat 写的,能够替换 SDWebImage,而 SnapKit 便是 Object-c 开发中比较常用的 masonryswift版别,事例以及对应三方库github地址如下所示

事例demo、 kingfisher、SnapKit

SnapKit

UI自适应布局结构,其采用链式风格开发,在swift中就愈加顺风顺水了,需求先增加到视图中,在进行布局设定,一些参数预留之后,会依据内容自动拉伸,事例代码如下

let bkg = UIView()
bkg.backgroundColor = UIColor(named: "theme_color")
self.view.addSubview(bkg)
bkg.snp.makeConstraints { make in
    make.left.equalTo(self.view).offset(15)
    make.right.equalTo(self.view).offset(-15)
    make.top.equalTo(100)
}
bkg.addSubview(self.ivHeader)
self.ivHeader.snp.makeConstraints { make in
    make.left.top.equalTo(10)
    make.bottom.equalTo(bkg).offset(-10) //相对于bkg的底部 10 像素,右和下贴近内部都是负的
    make.width.height.equalTo(120)
}
self.lblUseName.text = "哈哈哈哈哈哈"
self.lblUseName.numberOfLines = 0;
self.lblUseName.sizeToFit() //自适应换行
self.view.addSubview(self.lblUseName)
self.lblUseName.snp.makeConstraints { make in
    make.left.equalTo(self.ivHeader.snp.right).offset(10)
    make.centerY.equalTo(self.ivHeader.snp.centerY)
}

别的,开发过程中,可能会常常碰到两个内容需求争夺一片固定空间的时候,那么需求一个优先级,让优先级高的内容先显现全了,剩下空间交给别的一个(和 flex 布局中的 flex: 1 很像),那么能够像下面代码一样运用,平时运用过程中的场景(例如:谈论中的用户名和一些附加信息,可能需求先显现全部分附加信息,再显现可长可短的用户名,然后依据剩下空间决议其他附加信息的长短或许是否显现)

//第二个参数是指的方向.horizontal水平、.vertical笔直,第一个参数值的是权限
//设置拥抱权限等级,有好几个,一般运用 .required、.defaultHigh、.defaultLow,中间也有其他一般这就够了
//不设置默许为.required优先级1000,其他两个分别750、250,能够点进去看看
//hug有拥抱的意思,指的是拥抱权限,即抗拉伸的权限
self.lblUseName.setContentHuggingPriority(.required, for: .horizontal)
//设置耐揉捏,即抗揉捏的权限
self.lblUseName.setContentCompressionResistancePriority(.required, for: .horizontal)

Kingfisher

Kingfisher 便是 Swift 版别的 SDWebImage(异步加载图片结构),此外还增加了一些常用小功用,options 里面能够增加许多小功用,能够点进去检查自己想要的,事例罗列除了一些比较常用的功用(更重要的是,咱们一直纠结的不同版别的离屏烘托的圆角问题,这里能够将图片直接裁剪,因此也不必纠结那么多了),运用如下所示

//运用默许图片
let url = URL(string: "https://www.6hu.cc/files/2023/05/1684273995-5fb2773128e116e.jpeg?x-oss-process=image%2Fformat%2Cwebp")
//self.ivHeader.kf.setImage(with: url)
//设置占位
let image = UIImage(named: "logo");
//self.ivHeader.kf.setImage(with: url, placeholder: image)
//加工设置圆角,默许没有圆角,这样能够防止设置圆角的一些性能问题
let processor = DownsamplingImageProcessor(size: CGSize(width: 120, height: 120))
             |> RoundCornerImageProcessor(cornerRadius: 60)
//能够设置许多属性,能够点进去检查
self.ivHeader.kf.setImage(with: url, placeholder: image, options: [
    .processor(processor), //加工图像
    .scaleFactor(UIScreen.main.scale), //像素倍率scale
    .transition(.fade(1)), //突变动画
    .loadDiskFileSynchronously,//从磁盘同步加载 .cacheMemoryOnly()仅仅内存缓存
    .cacheOriginalImage
]) { result in
    //加载结束后的回调,如果需求除了,能够在这里处理
    switch result {
    case .success(let value):
        print("Task done for: \(value.source.url?.absoluteString ?? "")")
    case .failure(let error):
        print("Job failed: \(error.localizedDescription)")
    }
}
//设置指示器
self.ivHeader.kf.indicatorType = .activity //.none没有

此外,如果需求手动操控加载机遇(例如:大图加载优化、仅仅下载),能够运用 ImageDownloader 来下载,然后处理回调相关

//如果有大图加载优化等需求,或许其他依据其他状况自行处理下载的图片,能够走downLoad
//也有options和其他逻辑,能够依据需求运用
ImageDownloader.default.downloadImage(with: url!) { [weak self]result in
    switch result {
    case .success(let value):
        self?.ivHeader.image = value.image
    case .failure(let error):
        print(error)
    }
}

最后

看看效果图吧,就不做太多事例了,究竟运用确实很简单,别的api运用越简单,那么源码就越杂乱,源码才是咱们需求深层次探究的

swift中SnapKit以及Kingfisher的使用