// Copyright © 2021 Metabolist. All rights reserved. import SDWebImage import UIKit final class AnimatedAttachmentLabel: UILabel, EmojiInsertable { override init(frame: CGRect) { super.init(frame: frame) } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func drawText(in rect: CGRect) { super.drawText(in: rect) guard let attributedText = attributedText else { return } var attachmentImageViews = Set() attributedText.enumerateAttribute( .attachment, in: NSRange(location: 0, length: attributedText.length), options: .longestEffectiveRangeNotRequired) { attachment, _, _ in guard let animatedAttachment = attachment as? AnimatedTextAttachment, let imageBounds = animatedAttachment.imageBounds else { return } animatedAttachment.imageView.frame = imageBounds // iOS 15 needs this for some inexplicable reason if #available(iOS 15, *) { animatedAttachment.imageView.frame.origin.y -= font.lineHeight } animatedAttachment.imageView.contentMode = .scaleAspectFit if animatedAttachment.imageView.superview != self { addSubview(animatedAttachment.imageView) } attachmentImageViews.insert(animatedAttachment.imageView) } for subview in subviews { guard let attachmentImageView = subview as? SDAnimatedImageView else { continue } if !attachmentImageViews.contains(attachmentImageView) { attachmentImageView.removeFromSuperview() } } } }