裁切图像设置圆角图像,不使用控件的layer.cornerRadius属性

异步绘制图像,利用裁切图像设置圆角图像:

例子:

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


在 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 ()) {

       
//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
                 })
            }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值