LNToastView.swift 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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?) {
  12. guard let toast, !toast.isEmpty else { return }
  13. runOnMain {
  14. let view = LNToastView()
  15. view.show(toast)
  16. }
  17. }
  18. func cleanToasts() {
  19. allToast.allObjects.forEach { $0.removeFromSuperview() }
  20. }
  21. class LNToastView: UIView {
  22. private let textLabel = UILabel()
  23. override init(frame: CGRect) {
  24. super.init(frame: frame)
  25. setupViews()
  26. }
  27. func show(_ toast: String) {
  28. textLabel.text = toast
  29. guard let window = UIView.appKeyWindow else { return }
  30. window.addSubview(self)
  31. self.snp.makeConstraints { make in
  32. make.centerX.equalToSuperview()
  33. if LNKeyboardManager.shared.isEditing {
  34. make.centerY.equalToSuperview().multipliedBy(0.8)
  35. } else {
  36. make.centerY.equalToSuperview().multipliedBy(1.1)
  37. }
  38. make.leading.greaterThanOrEqualToSuperview().offset(56)
  39. }
  40. allToast.add(self)
  41. LNDelayTask.perform(delay: 2.5) { [weak self] in
  42. guard let self else { return }
  43. UIView.animate(withDuration: 0.3) { [weak self] in
  44. guard let self else { return }
  45. alpha = 0
  46. } completion: { [weak self] _ in
  47. guard let self else { return }
  48. removeFromSuperview()
  49. }
  50. }
  51. }
  52. required init?(coder: NSCoder) {
  53. fatalError("init(coder:) has not been implemented")
  54. }
  55. }
  56. extension LNToastView {
  57. private func setupViews() {
  58. layer.cornerRadius = 18
  59. backgroundColor = .black.withAlphaComponent(0.8)
  60. textLabel.font = .body_m
  61. textLabel.textColor = .text_1
  62. textLabel.numberOfLines = 0
  63. addSubview(textLabel)
  64. textLabel.snp.makeConstraints { make in
  65. make.center.equalToSuperview()
  66. make.leading.equalToSuperview().offset(16)
  67. make.top.equalToSuperview().offset(12)
  68. }
  69. }
  70. }