170 lines
5.7 KiB
Swift
170 lines
5.7 KiB
Swift
//
|
||
// 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)
|
||
}
|
||
})
|
||
}
|
||
}
|