异步绘制图像,利用裁切图像设置圆角图像:
例子:
/**
* 异步绘制图像,利用裁切图像设置圆角图像 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
})
}
}