124 lines
2.9 KiB
Swift
124 lines
2.9 KiB
Swift
|
|
//
|
||
|
|
// 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
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|