异步绘制图像,利用裁切图像设置圆角图像:
例子:
/**
* 异步绘制图像,利用裁切图像设置圆角图像 isCorner :表示是否裁剪
*/
fun LZJ_asyncDrawImage(size: CGSize , isCorner: Bool = false , backColor: UIColor ? = UIColor . whiteColor (), finished: (image: UIImage ) -> UIImage ) {
// 1. 开启上下文,需要注意 scale
UIGraphicsBeginImageContextWithOptions (size, true , UIScreen . mainScreen (). scale )
// 画圆
let rect = CGRect (origin: CGPointZero, size: size)
* 异步绘制图像,利用裁切图像设置圆角图像 isCorner :表示是否裁剪
*/
fun LZJ_asyncDrawImage(size: CGSize , isCorner: Bool = false , backColor: UIColor ? = UIColor . whiteColor (), finished: (image: UIImage ) -> UIImage ) {
// 1. 开启上下文,需要注意 scale
UIGraphicsBeginImageContextWithOptions (size, true , UIScreen . mainScreen (). scale )
// 画圆
let rect = CGRect (origin: CGPointZero, size: size)
//
设置填充颜色
这两句位置不能换,不然会看到边框颜色
backColor?.
setFill
()
UIRectFill (rect)
// 设置圆角 - 使用路径裁切,注意:写设置裁切路径,再绘制图像
if isCorner {
let path = UIBezierPath (ovalInRect: rect)
// 添加裁切路径 - 后续的绘制,都会被此路径裁切掉
path. addClip ()
}
// 绘制图像
self . drawInRect (rect)
// 从上下文中获取图片
let result = UIGraphicsGetImageFromCurrentImageContext ()
// 关闭图像上下文
UIGraphicsEndImageContext ()
// 主程序更新 UI ,提示:有的时候异步也能更新 UI ,但是会非常慢,
dispatch_async ( dispatch_get_main_queue ()) {
finished(image: result)
}
}
UIRectFill (rect)
// 设置圆角 - 使用路径裁切,注意:写设置裁切路径,再绘制图像
if isCorner {
let path = UIBezierPath (ovalInRect: rect)
// 添加裁切路径 - 后续的绘制,都会被此路径裁切掉
path. addClip ()
}
// 绘制图像
self . drawInRect (rect)
// 从上下文中获取图片
let result = UIGraphicsGetImageFromCurrentImageContext ()
// 关闭图像上下文
UIGraphicsEndImageContext ()
// 主程序更新 UI ,提示:有的时候异步也能更新 UI ,但是会非常慢,
dispatch_async ( dispatch_get_main_queue ()) {
finished(image: result)
}
}
}
在 UIImageview的分类中必须这么做,在显示图像时,才会有完整的圆角展示出来:
///
设置图像
///
/// - parameter urlString: urlString
/// - parameter placeholderName: placeholderName
/// - parameter size: 裁切图像的尺寸,默认 CGSizeZero ,不裁切
/// - parameter isCorner: 是否圆角裁切,默认不裁切,只有在 size != CGSizeZero 有效
/// - parameter backColor: 背景颜色,默认颜色 白色,只有在 size != CGSizeZero 有效
func LZJ_setImageWithURL(
urlString: String ?,
placeHolderName: String ?,
size: CGSize = CGSizeZero ,
isCorner: Bool = false ,
backColor: UIColor ? = UIColor . whiteColor ()) {
///
/// - parameter urlString: urlString
/// - parameter placeholderName: placeholderName
/// - parameter size: 裁切图像的尺寸,默认 CGSizeZero ,不裁切
/// - parameter isCorner: 是否圆角裁切,默认不裁切,只有在 size != CGSizeZero 有效
/// - parameter backColor: 背景颜色,默认颜色 白色,只有在 size != CGSizeZero 有效
func LZJ_setImageWithURL(
urlString: String ?,
placeHolderName: String ?,
size: CGSize = CGSizeZero ,
isCorner: Bool = false ,
backColor: UIColor ? = UIColor . whiteColor ()) {
//placeHolderImage 占位图片
var placeHolderImage: UIImage ?
if placeHolderName != nil {
placeHolderImage = UIImage (named: placeHolderName!)
}
// 如果 URL 为 nil
guard let urlString = urlString,
let url = NSURL (string: urlString) else {
// 如果 urlString 为 nil ,但是指定了占位图像,显示占位图像
image = placeHolderImage
return
}
// 判断 裁剪尺寸
if size == CGSizeZero {
sd_setImageWithURL (url , placeholderImage: placeHolderImage)
return
}
// 对图像进行裁切,提示:从网络不一定能够获取到图像
sd_setImageWithURL (url, placeholderImage: placeHolderImage) { (image, _ , _ , _ ) -> Void in
//1. 判断图像是否存在,
guard let image = image else {
return
}
// 2. 对图像进行裁切
image. lzj_asyncDrawImage (size, isCorner: isCorner, backColor: backColor, finished: { (image) -> () in
self . image = image
})
}
}