LNToastView.swift 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //
  2. // LNToastView.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/15.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. var allToast = NSHashTable<UIView>(options: .weakMemory)
  11. func showToast(_ toast: String?, icon: UIImage? = nil) {
  12. guard let toast, !toast.isEmpty else { return }
  13. runOnMain {
  14. let view = LNToastView()
  15. view.show(toast, icon: icon)
  16. }
  17. }
  18. func cleanToasts() {
  19. allToast.allObjects.forEach { $0.removeFromSuperview() }
  20. }
  21. class LNToastView: UIView {
  22. private let iconView = UIImageView()
  23. private let textLabel = UILabel()
  24. override init(frame: CGRect) {
  25. super.init(frame: frame)
  26. setupViews()
  27. }
  28. func show(_ toast: String, icon: UIImage? = nil) {
  29. textLabel.text = toast
  30. iconView.image = icon
  31. iconView.isHidden = icon == nil
  32. guard let window = UIView.appKeyWindow else { return }
  33. window.addSubview(self)
  34. self.snp.makeConstraints { make in
  35. make.centerX.equalToSuperview()
  36. if LNKeyboardManager.shared.isEditing {
  37. make.centerY.equalToSuperview().multipliedBy(0.8)
  38. } else {
  39. make.centerY.equalToSuperview().multipliedBy(1.1)
  40. }
  41. make.leading.greaterThanOrEqualToSuperview().offset(56)
  42. }
  43. allToast.add(self)
  44. LNDelayTask.perform(delay: 2.5) { [weak self] in
  45. guard let self else { return }
  46. UIView.animate(withDuration: 0.3) { [weak self] in
  47. guard let self else { return }
  48. alpha = 0
  49. } completion: { [weak self] _ in
  50. guard let self else { return }
  51. removeFromSuperview()
  52. }
  53. }
  54. }
  55. required init?(coder: NSCoder) {
  56. fatalError("init(coder:) has not been implemented")
  57. }
  58. }
  59. extension LNToastView {
  60. private func setupViews() {
  61. layer.cornerRadius = 18
  62. backgroundColor = .black.withAlphaComponent(0.8)
  63. let stackView = UIStackView()
  64. stackView.spacing = 4
  65. stackView.axis = .vertical
  66. stackView.alignment = .center
  67. addSubview(stackView)
  68. stackView.snp.makeConstraints { make in
  69. make.horizontalEdges.equalToSuperview().inset(16)
  70. make.verticalEdges.equalToSuperview().inset(12)
  71. }
  72. stackView.addArrangedSubview(iconView)
  73. iconView.snp.makeConstraints { make in
  74. make.width.height.equalTo(32)
  75. }
  76. textLabel.font = .body_m
  77. textLabel.textColor = .text_1
  78. textLabel.numberOfLines = 0
  79. stackView.addArrangedSubview(textLabel)
  80. }
  81. }