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

本文介绍了一种异步绘制带有圆角效果的图像的方法,包括如何设置图像的背景色、绘制圆形背景、添加圆角效果及裁剪图像等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

例子:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值