KeyboardFunctionPopView.swift 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. //
  2. // KeyboardFunctionPopView.swift
  3. // AiKeyboard
  4. //
  5. // Created by Destiny on 2025/4/23.
  6. //
  7. import UIKit
  8. class KeyboardFunctionPopView: UIView {
  9. var selectClosure: ((KeyboardType) -> Void)?
  10. var buttons = [UIButton]()
  11. var selectType: KeyboardType? {
  12. didSet {
  13. self.updateUI()
  14. }
  15. }
  16. lazy var contentView: UIView = {
  17. let view = UIView()
  18. view.isHidden = true
  19. view.backgroundColor = .white
  20. view.layer.cornerRadius = 16
  21. return view
  22. }()
  23. lazy var selectFuncView: UIView = {
  24. let view = UIView()
  25. view.isUserInteractionEnabled = true
  26. let tap = UITapGestureRecognizer(target: self, action: #selector(closeButtonTapped))
  27. view.addGestureRecognizer(tap)
  28. return view
  29. }()
  30. lazy var selectFuncLabel: UILabel = {
  31. let label = UILabel()
  32. label.text = "帮聊"
  33. label.font = .boldSystemFont(ofSize: 12)
  34. label.textColor = .hexStringColor(hexString: "#000000", alpha: 0.8)
  35. return label
  36. }()
  37. lazy var arrowIcon: UIImageView = {
  38. let icon = UIImageView()
  39. icon.image = UIImage(named: "icon_arrow_up")
  40. return icon
  41. }()
  42. lazy var funcHelpBtn: UIButton = {
  43. let btn = UIButton()
  44. btn.tag = 0
  45. btn.isSelected = true
  46. btn.setBackgroundImage(UIImage(named: "keyboard_func_select_bg"), for: .selected)
  47. btn.setTitle("帮聊", for: .normal)
  48. btn.setTitleColor(.hexStringColor(hexString: "#000000", alpha: 0.8), for: .normal)
  49. btn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 12)
  50. btn.addTarget(self, action: #selector(functionBtnTapped(_:)), for: .touchUpInside)
  51. return btn
  52. }()
  53. lazy var funcTeachBtn: UIButton = {
  54. let btn = UIButton()
  55. btn.tag = 1
  56. btn.setBackgroundImage(UIImage(named: "keyboard_func_select_bg"), for: .selected)
  57. btn.setTitle("教你说", for: .normal)
  58. btn.setTitleColor(.hexStringColor(hexString: "#000000", alpha: 0.8), for: .normal)
  59. btn.titleLabel?.font = UIFont.systemFont(ofSize: 12)
  60. btn.addTarget(self, action: #selector(functionBtnTapped(_:)), for: .touchUpInside)
  61. return btn
  62. }()
  63. lazy var funcPrologueBtn: UIButton = {
  64. let btn = UIButton()
  65. btn.tag = 2
  66. btn.setBackgroundImage(UIImage(named: "keyboard_func_select_bg"), for: .selected)
  67. btn.setTitle("开场白", for: .normal)
  68. btn.setTitleColor(.hexStringColor(hexString: "#000000", alpha: 0.8), for: .normal)
  69. btn.titleLabel?.font = UIFont.systemFont(ofSize: 12)
  70. btn.addTarget(self, action: #selector(functionBtnTapped(_:)), for: .touchUpInside)
  71. return btn
  72. }()
  73. override init(frame: CGRect) {
  74. super.init(frame: frame)
  75. setUI()
  76. setupTapGesture()
  77. buttons = [funcHelpBtn, funcTeachBtn, funcPrologueBtn]
  78. }
  79. required init?(coder: NSCoder) {
  80. fatalError("init(coder:) has not been implemented")
  81. }
  82. class func show(view: UIView, selectType: KeyboardType, selectClosure: @escaping (KeyboardType) -> Void) {
  83. let window = KeyboardFunctionPopView(frame: CGRect(x: 0, y: 0, width: KeyboardConst.kb_kScreenW, height: KeyboardConst.kb_kScreenH))
  84. window.selectClosure = selectClosure
  85. window.selectType = selectType
  86. view.addSubview(window)
  87. window.snp.makeConstraints { make in
  88. make.edges.equalToSuperview()
  89. }
  90. UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 0.95, initialSpringVelocity: 0.05) {
  91. window.contentView.isHidden = false
  92. }
  93. }
  94. }
  95. extension KeyboardFunctionPopView {
  96. @objc func closeButtonTapped() {
  97. self.removeFromSuperview()
  98. }
  99. @objc func functionBtnTapped(_ sender: UIButton) {
  100. for button in buttons {
  101. button.isSelected = false
  102. }
  103. sender.isSelected = true
  104. self.selectClosure?(KeyboardType(rawValue: sender.tag) ?? .teach)
  105. self.closeButtonTapped()
  106. }
  107. }
  108. extension KeyboardFunctionPopView: UIGestureRecognizerDelegate {
  109. // 添加点击手势识别器
  110. private func setupTapGesture() {
  111. let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleBackgroundTap(_:)))
  112. tapGesture.delegate = self
  113. self.addGestureRecognizer(tapGesture)
  114. }
  115. // MARK: - Actions
  116. @objc private func handleBackgroundTap(_ gesture: UITapGestureRecognizer) {
  117. let location = gesture.location(in: self)
  118. if !contentView.frame.contains(location) {
  119. self.closeButtonTapped()
  120. }
  121. }
  122. func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
  123. // 确保点击事件不是发生在containerView上
  124. let location = touch.location(in: self)
  125. return !contentView.frame.contains(location)
  126. }
  127. }
  128. extension KeyboardFunctionPopView {
  129. func updateUI() {
  130. switch self.selectType {
  131. case .help:
  132. self.selectFuncLabel.text = "帮聊"
  133. break
  134. case .teach:
  135. self.selectFuncLabel.text = "教你说"
  136. break
  137. case .prologue:
  138. self.selectFuncLabel.text = "开场白"
  139. break
  140. default:
  141. break
  142. }
  143. for button in buttons {
  144. if button.tag == self.selectType?.rawValue ?? 0 {
  145. button.isSelected = true
  146. button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 12)
  147. } else {
  148. button.isSelected = false
  149. button.titleLabel?.font = UIFont.systemFont(ofSize: 12)
  150. }
  151. }
  152. }
  153. func setUI() {
  154. self.addSubview(contentView)
  155. contentView.snp.makeConstraints { make in
  156. make.size.equalTo(CGSize(width: 85, height: 162))
  157. make.left.equalTo(55)
  158. make.top.equalTo(17)
  159. }
  160. contentView.addSubview(selectFuncView)
  161. selectFuncView.snp.makeConstraints { make in
  162. make.left.top.right.equalTo(0)
  163. make.height.equalTo(32)
  164. }
  165. selectFuncView.addSubview(selectFuncLabel)
  166. selectFuncLabel.snp.makeConstraints { make in
  167. make.left.equalTo(12)
  168. make.centerY.equalToSuperview()
  169. }
  170. selectFuncView.addSubview(arrowIcon)
  171. arrowIcon.snp.makeConstraints { make in
  172. make.size.equalTo(CGSize(width: 18, height: 18))
  173. make.centerY.equalToSuperview()
  174. make.right.equalTo(-5)
  175. }
  176. contentView.addSubview(funcHelpBtn)
  177. funcHelpBtn.snp.makeConstraints { make in
  178. make.size.equalTo(CGSize(width: 81, height: 32))
  179. make.left.equalTo(2)
  180. make.right.equalTo(-2)
  181. make.top.equalTo(selectFuncView.snp.bottom).offset(9)
  182. }
  183. contentView.addSubview(funcTeachBtn)
  184. funcTeachBtn.snp.makeConstraints { make in
  185. make.size.equalTo(CGSize(width: 81, height: 32))
  186. make.left.equalTo(2)
  187. make.right.equalTo(-2)
  188. make.top.equalTo(funcHelpBtn.snp.bottom).offset(8)
  189. }
  190. contentView.addSubview(funcPrologueBtn)
  191. funcPrologueBtn.snp.makeConstraints { make in
  192. make.size.equalTo(CGSize(width: 81, height: 32))
  193. make.left.equalTo(2)
  194. make.right.equalTo(-2)
  195. make.top.equalTo(funcTeachBtn.snp.bottom).offset(8)
  196. }
  197. }
  198. }