Visual_Novel_iOS/crush/Crush/Src/Components/UI/BaseView/CLImageViews.swift

124 lines
2.9 KiB
Swift
Raw Normal View History

2025-10-09 10:29:35 +00:00
//
// CLImageViews.swift
// Crush
//
// Created by Leon on 2025/7/20.
//
import UIKit
import SnapKit
class CLAnimatedImage: UIImageView {
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
override init(image: UIImage?) {
super.init(image: image)
setupViews()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupViews()
}
private func setupViews() {
contentMode = .scaleAspectFill
}
override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = bounds.size.height * 0.5
layer.masksToBounds = true
}
}
class CLImageView: UIImageView {
convenience init(){
self.init(frame: .zero)
}
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
override init(image: UIImage?) {
super.init(image: image)
setupViews()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupViews()
}
private func setupViews() {
contentMode = .scaleAspectFill
}
}
/// ,
class AutoRatioImageView: CLImageView {
//
private var aspectRatioConstraint: Constraint?
convenience init() {
self.init(frame: .zero)
}
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
}
private func setupView() {
contentMode = .scaleAspectFill
clipsToBounds = true //
self.snp.makeConstraints { make in
make.height.equalTo(self.snp.width).priority(.low)
}
}
///
func setImage(_ image: UIImage?) {
self.image = image
updateAspectRatio(for: image?.size)
}
///
func setImage(with url: URL?, placeholder: UIImage? = nil) {
self.kf.setImage(with: url, placeholder: placeholder, completionHandler: { [weak self] result in
switch result {
case .success(let value):
self?.updateAspectRatio(for: value.image.size)
case .failure:
self?.updateAspectRatio(for: placeholder?.size)
}
})
}
///
private func updateAspectRatio(for size: CGSize?) {
guard let size = size, size.width > 0 else { return }
let ratio = size.height / size.width
//
aspectRatioConstraint?.deactivate()
// = *
self.snp.makeConstraints { make in
aspectRatioConstraint = make.height.equalTo(self.snp.width).multipliedBy(ratio).constraint
}
}
}