LNRoomNameInputPanel.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. //
  2. // LNRoomNameInputPanel.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/9.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNRoomNameInputPanel: LNPopupView {
  11. private let nameInputField = UITextField()
  12. var handler: ((String) -> Void)?
  13. override init(frame: CGRect) {
  14. super.init(frame: frame)
  15. setupViews()
  16. }
  17. func update(_ name: String?) {
  18. nameInputField.text = name
  19. }
  20. override func popup(_ targetView: UIView? = nil, animated: Bool = true) {
  21. super.popup(targetView, animated: animated)
  22. nameInputField.becomeFirstResponder()
  23. }
  24. required init?(coder: NSCoder) {
  25. fatalError("init(coder:) has not been implemented")
  26. }
  27. }
  28. extension LNRoomNameInputPanel: UITextFieldDelegate {
  29. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
  30. let currentText = textField.text ?? ""
  31. guard let range = Range(range, in: currentText) else { return false }
  32. let newText = currentText.replacingCharacters(in: range, with: string)
  33. if newText.count < currentText.count {
  34. return true
  35. }
  36. return newText.count <= LNRoomManager.RoomNameMaxInput
  37. }
  38. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  39. textField.resignFirstResponder()
  40. if let currentText = textField.text,
  41. currentText.count >= LNRoomManager.RoomNameMinInput,
  42. currentText.count <= LNRoomManager.RoomNameMaxInput {
  43. dismiss()
  44. handler?(currentText)
  45. }
  46. return true
  47. }
  48. }
  49. extension LNRoomNameInputPanel {
  50. private func setupViews() {
  51. let header = buildHeader()
  52. container.addSubview(header)
  53. header.snp.makeConstraints { make in
  54. make.horizontalEdges.equalToSuperview()
  55. make.top.equalToSuperview()
  56. }
  57. let input = buildNameView()
  58. container.addSubview(input)
  59. input.snp.makeConstraints { make in
  60. make.horizontalEdges.equalToSuperview().inset(16)
  61. make.top.equalTo(header.snp.bottom)
  62. }
  63. let tipsLabel = UILabel()
  64. tipsLabel.font = .body_s
  65. tipsLabel.textColor = .text_3
  66. tipsLabel.text = .init(key: "A00320", LNRoomManager.RoomNameMinInput, LNRoomManager.RoomNameMaxInput)
  67. container.addSubview(tipsLabel)
  68. tipsLabel.snp.makeConstraints { make in
  69. make.trailing.equalToSuperview().offset(-16)
  70. make.top.equalTo(input.snp.bottom).offset(8)
  71. make.bottom.equalToSuperview().offset(commonBottomInset)
  72. }
  73. nameInputField.visibleView = tipsLabel
  74. }
  75. private func buildHeader() -> UIView {
  76. let header = UIView()
  77. header.snp.makeConstraints { make in
  78. make.height.equalTo(50)
  79. }
  80. let titleLabel = UILabel()
  81. titleLabel.font = .heading_h3
  82. titleLabel.textColor = .text_5
  83. titleLabel.text = .init(key: "A00315")
  84. header.addSubview(titleLabel)
  85. titleLabel.snp.makeConstraints { make in
  86. make.center.equalToSuperview()
  87. }
  88. return header
  89. }
  90. private func buildNameView() -> UIView {
  91. let container = UIView()
  92. container.backgroundColor = .fill_1
  93. container.layer.cornerRadius = 8
  94. container.snp.makeConstraints { make in
  95. make.height.equalTo(46)
  96. }
  97. nameInputField.placeholder = .init(key: "A00316")
  98. nameInputField.font = .heading_h4
  99. nameInputField.textColor = .text_5
  100. nameInputField.returnKeyType = .done
  101. nameInputField.delegate = self
  102. nameInputField.clearButtonMode = .whileEditing
  103. container.addSubview(nameInputField)
  104. nameInputField.snp.makeConstraints { make in
  105. make.horizontalEdges.equalToSuperview().inset(12)
  106. make.centerY.equalToSuperview()
  107. }
  108. return container
  109. }
  110. }