ReaderHive/ReaderHive/Base/View/NRImageView.swift
2025-12-17 18:04:38 +08:00

100 lines
2.7 KiB
Swift

//
// NRImageView.swift
// ReaderHive
//
// Created by on 2025/11/21.
//
import UIKit
import Kingfisher
class NRImageView: UIImageView {
var placeholderColor = UIColor.E_0_E_0_E_0
var placeholderImage = UIImage(named: "placeholder_image")
private lazy var placeholderImageView: UIImageView = {
let imageView = UIImageView(image: placeholderImage)
imageView.isHidden = true
imageView.contentMode = .scaleAspectFit
return imageView
}()
override init(frame: CGRect) {
super.init(frame: frame)
_init()
}
override init(image: UIImage?) {
super.init(image: image)
_init()
}
override init(image: UIImage?, highlightedImage: UIImage?) {
super.init(image: image, highlightedImage: highlightedImage)
_init()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
_init()
}
override func awakeFromNib() {
super.awakeFromNib()
_init()
}
func _init() {
self.contentMode = .scaleAspectFill
self.layer.masksToBounds = true
if image == nil {
self.backgroundColor = self.placeholderColor
placeholderImageView.isHidden = false
}
addSubview(placeholderImageView)
}
override var image: UIImage? {
didSet {
if self.backgroundColor == nil && image == nil {
self.backgroundColor = self.placeholderColor
} else if image != nil {
if self.backgroundColor == self.placeholderColor {
self.backgroundColor = nil
}
}
if image == nil {
placeholderImageView.isHidden = false
} else {
placeholderImageView.isHidden = true
}
}
}
override func layoutSubviews() {
super.layoutSubviews()
placeholderImageView.frame = .init(x: 0, y: 0, width: self.bounds.width * (1 / 3), height: self.bounds.height * (1 / 3))
placeholderImageView.center = .init(x: self.bounds.width / 2, y: self.bounds.height / 2)
}
}
extension UIImageView {
func nr_setImage(_ url: String?, placeholder: UIImage? = nil, completer: ((_ image: UIImage?, _ url: URL?) -> Void)? = nil) {
self.kf.setImage(with: URL(string: url ?? ""), placeholder: placeholder, options: nil) { result in
switch result {
case .success(let value):
completer?(value.image, value.source.url)
default :
completer?(nil, nil)
break
}
}
}
}