| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- //
- // LNRoomGiftMessageCell.swift
- // Gami
- //
- // Created by OneeChan on 2026/3/26.
- //
- import Foundation
- import UIKit
- import SnapKit
- class LNRoomGiftMessageCell: UITableViewCell {
- private let contentLabel = UILabel()
- private let attachment = NSTextAttachment(image: .icGift)
- private var curItem: LNRoomGiftMessageItem?
-
- override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
- super.init(style: style, reuseIdentifier: reuseIdentifier)
-
- setupViews()
-
- attachment.bounds = .init(x: 0, y: -6.5, width: 22, height: 22)
- }
-
- func update(_ message: LNRoomGiftMessageItem) {
- curItem = message
- contentLabel.attributedText = buildContent(message)
-
- guard let iconURL = URL(string: message.giftIcon), !message.giftIcon.isEmpty else { return }
- SDWebImageManager.shared.loadImage(with: iconURL, progress: nil) { [weak self] image, _, error, _, _, _ in
- guard let self else { return }
- guard error == nil, let image else { return }
- guard self.curItem === message else { return }
- attachment.image = image
- contentLabel.attributedText = contentLabel.attributedText
- }
- }
-
- override func prepareForReuse() {
- super.prepareForReuse()
-
- contentLabel.attributedText = nil
- curItem = nil
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
- extension LNRoomGiftMessageCell {
- private func buildContent(_ message: LNRoomGiftMessageItem, giftImage: UIImage = .icGift) -> NSAttributedString {
- let text = String(key: "B00130", message.senderName, message.receiverName, message.giftCount)
- let attr = NSMutableAttributedString(string: text, attributes: [
- .font: UIFont.heading_h5,
- .foregroundColor: UIColor.text_1
- ])
-
- let senderRange = (text as NSString).range(of: message.senderName)
- attr.addAttributes([
- .font: UIFont.heading_h5,
- .foregroundColor: UIColor.text_7
- ], range: senderRange)
-
- let receiverRange = (text as NSString).range(of: message.receiverName)
- attr.addAttributes([
- .font: UIFont.heading_h5,
- .foregroundColor: UIColor.text_7
- ], range: receiverRange)
-
- let countRange: NSRange? = if text.contains("x\(message.giftCount)") {
- (text as NSString).range(of: "x\(message.giftCount)")
- } else if text.contains("\(message.giftCount)x") {
- (text as NSString).range(of: "\(message.giftCount)x")
- } else {
- nil
- }
- if let countRange {
- attr.addAttributes([
- .font: UIFont.heading_h5,
- .foregroundColor: UIColor.text_7
- ], range: countRange)
- }
-
- let giftIconRange = (text as NSString).range(of: "{icon}")
- attr.replaceCharacters(in: giftIconRange, with: .init(attachment: attachment))
-
- return attr
- }
- }
- extension LNRoomGiftMessageCell {
- private func setupViews() {
- backgroundColor = .clear
-
- let container = UIView()
- container.backgroundColor = .fill.withAlphaComponent(0.12)
- container.layer.cornerRadius = 12
- container.onTap { [weak self] in
- guard let self else { return }
- guard let curItem else { return }
- let panel = LNRoomProfileCardPanel()
- panel.load(curItem.sender)
- panel.popup(self)
- }
- contentView.addSubview(container)
- container.snp.makeConstraints { make in
- make.verticalEdges.equalToSuperview().inset(8)
- make.leading.equalToSuperview()
- make.trailing.lessThanOrEqualToSuperview()
- }
-
- contentLabel.text = " "
- contentLabel.font = .heading_h5
- contentLabel.textColor = .text_1
- contentLabel.numberOfLines = 0
- container.addSubview(contentLabel)
- contentLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(10)
- make.verticalEdges.equalToSuperview().inset(8)
- }
- }
- }
|