Swift 如何实现类似kingfisher点语法imageView.kf.setImage

1.声明一个类RoundCorner

public final class RoundCorner<Base> {
    
    public let base : Base
    public init(_ base : Base){
        self.base = base
    }
}

2.声明一个空协议,协议名RoundCornerCompatible

public protocol RoundCornerCompatible {

}

3.在协议扩展中,添加一个只读属性dx,返回一个RoundCorner对象

public extension RoundCornerCompatible {
    public var dx : RoundCorner<Self> {
        get { return RoundCorner(self) }
    }
}

4.将所需要实现.dx语法的Base类遵守RoundCornerCompatible
凡是遵守这个协议RoundCornerCompatible的类,便拥有了.dx这个属性

extension UIView : RoundCornerCompatible {}

到现在为止,凡是UIView的子类,便可以使用.dx,而这个.dx实际上就是RoundCorner这个实例对象,下面给这个对象添加自定义的方法
5.在RoundCorner的扩展中,添加定义的方法

extension RoundCorner where Base: UIView{
    /// 设置一个四角圆角
    ///
    /// - Parameters:
    ///   - radius: 圆角半径
    ///   - cornerColor: 圆角背景色
    public func roundCorner(radius: CGFloat,cornerColor: UIColor)  {
        
        base.layer.dx_roundCorner(radius: radius, cornerColor: cornerColor)
    }
    
    /// 设置一个普通圆角
    ///
    /// - Parameters:
    ///   - radius: 圆角半径
    ///   - cornerColor: 圆角背景色
    ///   - corners: 圆角位置
    public func roundCorner(radius: CGFloat,cornerColor: UIColor,corners: UIRectCorner) {
        base.layer.dx_roundCorner(radius: radius, cornerColor: cornerColor, corners: corners)
    }
    
    ///  设置一个带边框的圆角
    ///
    /// - Parameters:
    ///   - radius: 圆角半径
    ///   - cornerColor: 圆角背景色
    ///   - corners: 圆角位置
    ///   - borderColor: 边框颜色
    ///   - borderWidth: 边框线宽
    func roundCorner(radii: CGSize,cornerColor: UIColor, corners: UIRectCorner, borderColor: UIColor, borderWidth: CGFloat)  {
        base.layer.dx_roundCorner(cornerRadii: radii, cornerColor: cornerColor, corners: corners, borderColor: borderColor, borderWidth: borderWidth)
    }
}

使用示例

let circle = UIView()
circle.dx.roundCorner(radius: 15/2, cornerColor: color)

label.dx.roundCorner(radius: 20/2, cornerColor: UIColor.white,corners: [.topLeft,.topRight, .bottomRight, .bottomLeft])

demo下载示例
参考文章:Kingfisher学习笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,056评论 3 119
  • 在完成了博客的搭建之后,我们后续的主要任务就是创作内容了。而创作的过程中,我们又会有一系列的问题,比如:我们用什么...
    程序猿DD阅读 5,572评论 0 14
  • 从来没有想到,几十年后的某一天的相聚,成年人或者说人成熟了,因为懂得所以就失去了太多因憧憬而生的美好。 ...
    菜根宴阅读 1,369评论 0 0
  • 【日精进打卡第151天】 【知~学习】 《六项精进》 2遍 共 244遍 《大学》 2遍 共244遍 【经典...
    李红柳阅读 1,058评论 0 0
  • 姓名:潘亚平 公司:福建起步儿童用品有限公司 日精进打卡第61天 【知~学习】 《六项精进》1遍共62遍 《大学》...
    徒手敬岁月_114e阅读 1,027评论 0 0

友情链接更多精彩内容