// // ImagePlugin.swift // DLSDK // // Created by osell on 2023/4/14. // import UIKit import Kingfisher import CoreMedia public protocol ImageSource { /// 图片资源URL var imageURL: URL? { get } /// 图片资源字符串 var imageStr: String? { get } } extension ImageSource { var imageURL: URL? { nil } var imageStr: String? { nil } } extension String: ImageSource { public var imageURL: URL? { URL(string: self.urlEncodingWithQueryAllowedCharacters) } public var imageStr: String? { self } } extension URL: ImageSource { public var imageURL: URL? { self } public var imageStr: String? { self.absoluteString.urlDecoded } } // MARK: - UIImageView extension DLWrapper where Base: UIImageView { /// 设置图片 /// - Parameters: /// - url: 图片链接/名称, URL or String /// - placeholder: 可选,默认nil /// - completionHandler: 可选,默认为nil @MainActor public func setImage(with url: ImageSource?, placeholder: UIImage? = nil, completionHandler: ((UIImage?, Error?) -> Void)? = nil) { guard let imageURL = url?.imageURL else { let imageStr = url?.imageStr ?? "" // 如果是本地图片,加载本地图片 if let image = UIImage(named: imageStr) { base.image = image return } // 如果是SDK中图片,则加载SDK中图片 if let image = UIImage(named: imageStr) { base.image = image return } // 都不存在,则置为nil base.image = placeholder return } // 如果是视频, 获取视频第一帧 if imageURL.imageStr?.contains(".mp4") == true { let source = AVAssetImageDataProvider(assetURL: imageURL, time: CMTimeMakeWithSeconds(0.0, preferredTimescale: 1)) base.kf.setImage(with: source.convertToSource(), placeholder: placeholder) { result in switch result { case let .success(imageinfo): completionHandler?(imageinfo.image, nil) case let .failure(error): completionHandler?(nil, error) } } } else { // 使用kf加载图片 base.kf.setImage(with: imageURL, placeholder: placeholder) { result in switch result { case let .success(imageinfo): completionHandler?(imageinfo.image, nil) case let .failure(error): completionHandler?(nil, error) } } } } } // MARK: - Button extension DLWrapper where Base: UIButton { /// 设置按钮图片 /// - Parameters: /// - url: 图片链接, URL or String /// - placeholder: 可选,默认nil /// - completionHandler: 可选,默认为nil @MainActor public func setImage(with url: ImageSource?, for state: UIControl.State, placeholder: UIImage? = nil, completionHandler: ((UIImage?, Error?) -> Void)? = nil) { guard let imageURL = url?.imageURL else { let imageStr = url?.imageStr ?? "" // 如果是本地图片,加载本地图片 if let image = UIImage(named: imageStr) { base.setImage(image, for: state) return } // 如果是SDK中图片,则加载SDK中图片 if let image = UIImage(named: imageStr) { base.setImage(image, for: state) return } // 都不存在,则置为nil base.setImage(placeholder, for: state) return } // 使用kf加载图片 base.kf.setImage(with: imageURL, for: state, placeholder: placeholder, completionHandler: { result in switch result { case let .success(imageinfo): completionHandler?(imageinfo.image, nil) case let .failure(error): completionHandler?(nil, error) } }) } /// 设置按钮背景图片 /// - Parameters: /// - url: 图片链接, URL or String /// - placeholder: 可选,默认nil /// - completionHandler: 可选,默认为nil @MainActor public func setBackgroundImage(with url: ImageSource?, for state: UIControl.State, placeholder: UIImage? = nil, completionHandler: ((UIImage?, Error?) -> Void)? = nil) { guard let imageURL = url?.imageURL else { let imageStr = url?.imageStr ?? "" // 如果是本地图片,加载本地图片 if let image = UIImage(named: imageStr) { base.setBackgroundImage(image, for: state) return } // 如果是SDK中图片,则加载SDK中图片 if let image = UIImage(named: imageStr) { base.setBackgroundImage(image, for: state) return } // 都不存在,则置为nil base.setBackgroundImage(placeholder, for: state) return } // 使用kf加载图片 base.kf.setBackgroundImage(with: imageURL, for: state, placeholder: placeholder, completionHandler: { result in switch result { case let .success(imageinfo): completionHandler?(imageinfo.image, nil) case let .failure(error): completionHandler?(nil, error) } }) } }