KeyboardFunctionPopView.swift 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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. window.layer.shadowColor = UIColor.hexStringColor(hexString: "#AEB2FF").cgColor
  87. window.layer.shadowOpacity = 0.4
  88. window.layer.shadowOffset = CGSize(width: 0, height: 0)
  89. window.layer.shadowRadius = 8.3
  90. view.addSubview(window)
  91. window.snp.makeConstraints { make in
  92. make.edges.equalToSuperview()
  93. }
  94. UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 0.95, initialSpringVelocity: 0.05) {
  95. window.contentView.isHidden = false
  96. }
  97. }
  98. }
  99. extension KeyboardFunctionPopView {
  100. @objc func closeButtonTapped() {
  101. self.removeFromSuperview()
  102. }
  103. @objc func functionBtnTapped(_ sender: UIButton) {
  104. for button in buttons {
  105. button.isSelected = false
  106. }
  107. sender.isSelected = true
  108. self.selectClosure?(KeyboardType(rawValue: sender.tag) ?? .teach)
  109. self.closeButtonTapped()
  110. }
  111. }
  112. extension KeyboardFunctionPopView: UIGestureRecognizerDelegate {
  113. // 添加点击手势识别器
  114. private func setupTapGesture() {
  115. let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleBackgroundTap(_:)))
  116. tapGesture.delegate = self
  117. self.addGestureRecognizer(tapGesture)
  118. }
  119. // MARK: - Actions
  120. @objc private func handleBackgroundTap(_ gesture: UITapGestureRecognizer) {
  121. let location = gesture.location(in: self)
  122. if !contentView.frame.contains(location) {
  123. self.closeButtonTapped()
  124. }
  125. }
  126. func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
  127. // 确保点击事件不是发生在containerView上
  128. let location = touch.location(in: self)
  129. return !contentView.frame.contains(location)
  130. }
  131. }
  132. extension KeyboardFunctionPopView {
  133. func updateUI() {
  134. switch self.selectType {
  135. case .help:
  136. self.selectFuncLabel.text = "帮聊"
  137. break
  138. case .teach:
  139. self.selectFuncLabel.text = "教你说"
  140. break
  141. case .prologue:
  142. self.selectFuncLabel.text = "开场白"
  143. break
  144. default:
  145. break
  146. }
  147. for button in buttons {
  148. if button.tag == self.selectType?.rawValue ?? 0 {
  149. button.isSelected = true
  150. button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 12)
  151. } else {
  152. button.isSelected = false
  153. button.titleLabel?.font = UIFont.systemFont(ofSize: 12)
  154. }
  155. }
  156. }
  157. func setUI() {
  158. self.addSubview(contentView)
  159. contentView.snp.makeConstraints { make in
  160. make.size.equalTo(CGSize(width: 85, height: 162))
  161. make.left.equalTo(55)
  162. make.top.equalTo(17)
  163. }
  164. contentView.addSubview(selectFuncView)
  165. selectFuncView.snp.makeConstraints { make in
  166. make.left.top.right.equalTo(0)
  167. make.height.equalTo(32)
  168. }
  169. selectFuncView.addSubview(selectFuncLabel)
  170. selectFuncLabel.snp.makeConstraints { make in
  171. make.left.equalTo(12)
  172. make.centerY.equalToSuperview()
  173. }
  174. selectFuncView.addSubview(arrowIcon)
  175. arrowIcon.snp.makeConstraints { make in
  176. make.size.equalTo(CGSize(width: 18, height: 18))
  177. make.centerY.equalToSuperview()
  178. make.right.equalTo(-5)
  179. }
  180. contentView.addSubview(funcHelpBtn)
  181. funcHelpBtn.snp.makeConstraints { make in
  182. make.size.equalTo(CGSize(width: 81, height: 32))
  183. make.left.equalTo(2)
  184. make.right.equalTo(-2)
  185. make.top.equalTo(selectFuncView.snp.bottom).offset(9)
  186. }
  187. contentView.addSubview(funcTeachBtn)
  188. funcTeachBtn.snp.makeConstraints { make in
  189. make.size.equalTo(CGSize(width: 81, height: 32))
  190. make.left.equalTo(2)
  191. make.right.equalTo(-2)
  192. make.top.equalTo(funcHelpBtn.snp.bottom).offset(8)
  193. }
  194. contentView.addSubview(funcPrologueBtn)
  195. funcPrologueBtn.snp.makeConstraints { make in
  196. make.size.equalTo(CGSize(width: 81, height: 32))
  197. make.left.equalTo(2)
  198. make.right.equalTo(-2)
  199. make.top.equalTo(funcTeachBtn.snp.bottom).offset(8)
  200. }
  201. }
  202. }