Files
simplex-chat/apps/ios/Shared/Views/Chat/ChatItem/AnimatedImageView.swift
2026-02-19 10:58:16 +00:00

70 lines
1.9 KiB
Swift

//
// Created by Avently on 19.12.2022.
// Copyright (c) 2022 SimpleX Chat. All rights reserved.
//
// Spec: spec/client/chat-view.md
import UIKit
import SwiftUI
// Spec: spec/client/chat-view.md#AnimatedImageView
class AnimatedImageView: UIView {
var image: UIImage? = nil
var imageView: UIImageView? = nil
var cMode: UIView.ContentMode = .scaleAspectFit
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("Not implemented")
}
convenience init(image: UIImage, contentMode: UIView.ContentMode) {
self.init()
self.image = image
self.cMode = contentMode
imageView = UIImageView(gifImage: image)
imageView!.contentMode = contentMode
self.addSubview(imageView!)
}
override func layoutSubviews() {
super.layoutSubviews()
imageView!.frame = bounds
}
func updateImage(_ image: UIImage) {
if let subview = self.subviews.first as? UIImageView {
if image.imageData != subview.gifImage?.imageData {
imageView = UIImageView(gifImage: image)
imageView!.contentMode = contentMode
self.addSubview(imageView!)
subview.removeFromSuperview()
}
}
imageView!.frame = bounds
self.layoutSubviews()
}
}
struct SwiftyGif: UIViewRepresentable {
private let image: UIImage
private let contentMode: UIView.ContentMode
init(image: UIImage, contentMode: UIView.ContentMode = .scaleAspectFit) {
self.image = image
self.contentMode = contentMode
}
func makeUIView(context: Context) -> AnimatedImageView {
AnimatedImageView(image: image, contentMode: contentMode)
}
func updateUIView(_ imageView: AnimatedImageView, context: Context) {
imageView.updateImage(image)
imageView.imageView!.startAnimatingGif()
}
}