KeyboardViewController.swift 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. //
  2. // KeyboardViewController.swift
  3. // AiKeyboard
  4. //
  5. // Created by Destiny on 2025/4/23.
  6. //
  7. import UIKit
  8. import Lottie
  9. import SnapKit
  10. import MarqueeLabel
  11. enum KeyboardType: Int {
  12. case help = 0 // 帮聊
  13. case teach = 1 // 教你说
  14. case prologue = 2 // 开场白
  15. }
  16. class KeyboardViewController: UIInputViewController {
  17. struct UX {
  18. static let keyboardHeight = 292.0
  19. }
  20. // 选择的键盘类型
  21. var chooseType: KeyboardType = .help {
  22. didSet {
  23. self.updateMainViewUI()
  24. }
  25. }
  26. // 键盘列表
  27. var keyboardList: [KeyboardModel]?
  28. // 选择的键盘
  29. var chooseKeyboard: KeyboardModel?
  30. // 人设列表
  31. var characterList: [CharacterModel]?
  32. // 开场白列表
  33. var prologueList: [PrologueModel]?
  34. // 开始持续删除
  35. private var deleteTimer: Timer?
  36. private var deleteAcceleration: TimeInterval = 0.1
  37. var heightConstriaint: NSLayoutConstraint?
  38. lazy var bgImageView: UIImageView = {
  39. let imageView = UIImageView()
  40. imageView.image = UIImage(named: "keyboard_bg")
  41. return imageView
  42. }()
  43. lazy var menuBtn: UIButton = {
  44. let button = UIButton()
  45. button.setImage(UIImage(named: "keyboard_menu_btn"), for: .normal)
  46. button.addTarget(self, action: #selector(menuBtnClickAction), for: .touchUpInside)
  47. return button
  48. }()
  49. lazy var heartAnimation: LottieAnimationView = {
  50. let animate = LottieAnimationView(name: "heart")
  51. animate.loopMode = .loop
  52. animate.backgroundColor = .clear
  53. return animate
  54. }()
  55. lazy var exchangeBtn: UIButton = {
  56. let button = UIButton()
  57. button.setImage(UIImage(named: "keyboard_exchange_btn"), for: .normal)
  58. return button
  59. }()
  60. lazy var chooseView: UIView = {
  61. let view = UIView()
  62. view.backgroundColor = .white
  63. view.layer.cornerRadius = 17
  64. return view
  65. }()
  66. lazy var functionView: UIView = {
  67. let view = UIView()
  68. view.backgroundColor = .hexStringColor(hexString: "#DDCFFD")
  69. view.layer.cornerRadius = 16
  70. view.isUserInteractionEnabled = true
  71. let tap = UITapGestureRecognizer(target: self, action: #selector(functionBtnClickAction))
  72. view.addGestureRecognizer(tap)
  73. return view
  74. }()
  75. lazy var functionLabel: UILabel = {
  76. let label = UILabel()
  77. label.text = "帮聊"
  78. label.font = .boldSystemFont(ofSize: 12)
  79. label.textColor = .hexStringColor(hexString: "#000000", alpha: 0.8)
  80. return label
  81. }()
  82. lazy var arrowIcon: UIImageView = {
  83. let imageView = UIImageView()
  84. imageView.image = UIImage(named: "icon_arrow_down")
  85. return imageView
  86. }()
  87. lazy var userChangeBtn: UIButton = {
  88. let btn = UIButton()
  89. btn.setTitle("小蕾", for: .normal)
  90. btn.titleLabel?.font = .systemFont(ofSize: 12, weight: .medium)
  91. btn.setTitleColor(.hexStringColor(hexString: "#000000").withAlphaComponent(0.8), for: .normal)
  92. btn.setImage(UIImage(named: "keyboard_user_change_icon"), for: .normal)
  93. btn.setImageTitleLayout(.imgRight, spacing: 8)
  94. btn.addTarget(self, action: #selector(changeBtnClickAction), for: .touchUpInside)
  95. return btn
  96. }()
  97. lazy var userChangeView: UIView = {
  98. let view = UIView()
  99. let tap = UITapGestureRecognizer(target: self, action: #selector(changeBtnClickAction))
  100. view.addGestureRecognizer(tap)
  101. return view
  102. }()
  103. lazy var userChangeLabel: MarqueeLabel = {
  104. let label = MarqueeLabel(frame: .zero, duration: 3.0, fadeLength: 0)
  105. label.type = .leftRight
  106. label.text = "通用键盘"
  107. label.font = .systemFont(ofSize: 12)
  108. label.textColor = .hexStringColor(hexString: "#000000")
  109. label.textAlignment = .center
  110. return label
  111. }()
  112. lazy var userChangeIcon: UIImageView = {
  113. let icon = UIImageView()
  114. icon.image = UIImage(named: "keyboard_user_change_icon")
  115. return icon
  116. }()
  117. lazy var helpView: KeyboardHelpView = {
  118. let view = KeyboardHelpView()
  119. view.delegate = self
  120. view.helpDelegate = self
  121. return view
  122. }()
  123. lazy var teachView: KeyboardTeachView = {
  124. let view = KeyboardTeachView()
  125. view.delegate = self
  126. view.teachDelegate = self
  127. view.isHidden = true
  128. return view
  129. }()
  130. lazy var prologueView: KeyboardPrologueView = {
  131. let view = KeyboardPrologueView()
  132. view.delegate = self
  133. view.prologueDelegate = self
  134. view.isHidden = true
  135. return view
  136. }()
  137. lazy var exchangeView: KeyboardExchangeView = {
  138. let view = KeyboardExchangeView()
  139. view.isHidden = true
  140. view.delegate = self
  141. return view
  142. }()
  143. lazy var menuView: KeyboardMenuView = {
  144. let view = KeyboardMenuView()
  145. view.delegate = self
  146. return view
  147. }()
  148. var nowShowView: UIView?
  149. override func viewWillAppear(_ animated: Bool) {
  150. super.viewWillAppear(animated)
  151. self.prepareHeightConstraint()
  152. }
  153. override func viewDidLoad() {
  154. super.viewDidLoad()
  155. setUI()
  156. KeyboardApi.initParams()
  157. requestKeyboardList()
  158. requestPrologueList()
  159. startMonitoringPasteboard()
  160. // self.nextKeyboardButton.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
  161. // self.nextKeyboardButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
  162. }
  163. override func viewWillLayoutSubviews() {
  164. super.viewWillLayoutSubviews()
  165. }
  166. override func updateViewConstraints() {
  167. super.updateViewConstraints()
  168. if self.view.frame.size.width == 0 && self.view.frame.size.height == 0 {
  169. return
  170. }
  171. self.prepareHeightConstraint()
  172. }
  173. override func textWillChange(_ textInput: UITextInput?) {
  174. // The app is about to change the document's contents. Perform any preparation here.
  175. }
  176. override func textDidChange(_ textInput: UITextInput?) {
  177. // The app has just changed the document's contents, the document context has been updated.
  178. var textColor: UIColor
  179. let proxy = self.textDocumentProxy
  180. if proxy.keyboardAppearance == UIKeyboardAppearance.dark {
  181. textColor = UIColor.white
  182. } else {
  183. textColor = UIColor.black
  184. }
  185. }
  186. func prepareHeightConstraint() {
  187. if self.heightConstriaint == nil {
  188. if let view = self.view {
  189. self.heightConstriaint = NSLayoutConstraint(item: view, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 0.0, constant: UX.keyboardHeight)
  190. self.heightConstriaint?.priority = UILayoutPriority(750)
  191. self.view.addConstraint(self.heightConstriaint!)
  192. }
  193. } else {
  194. self.heightConstriaint?.constant = UX.keyboardHeight
  195. }
  196. }
  197. }
  198. // MARK: - 网络请求
  199. extension KeyboardViewController {
  200. // 获取键盘列表
  201. func requestKeyboardList() {
  202. KeyboardNetworkManager.request(.keyboard_list(params: [:])) { response in
  203. if let keyboardInfos = try? response.mapArray(KeyboardModel.self, atKeyPath: "data.keyboardInfos") {
  204. self.keyboardList = keyboardInfos
  205. self.updateUserChangeBtnUI()
  206. self.requestCharacterList()
  207. print("成功解析数组,数量:\(keyboardInfos.count)")
  208. }
  209. } fail: { code, error in
  210. self.view.toast(text: error)
  211. print(error)
  212. }
  213. }
  214. // 获取键盘人设列表
  215. func requestCharacterList() {
  216. var params: [String: Any] = [String: Any]()
  217. if let chooseKeyboard = self.chooseKeyboard {
  218. params = ["keyboardId": chooseKeyboard.id ?? ""]
  219. }
  220. KeyboardNetworkManager.request(.character_list(params: params)) { response in
  221. if let characterInfos = try? response.mapArray(CharacterModel.self, atKeyPath: "data.characterInfos") {
  222. self.characterList = characterInfos
  223. self.updateCharacterUI()
  224. print("成功解析数组,数量:\(characterInfos.count)")
  225. }
  226. } fail: { code, error in
  227. self.view.toast(text: error)
  228. print(error)
  229. }
  230. }
  231. // 获取键盘人设列表
  232. func requestPrologueList() {
  233. KeyboardNetworkManager.request(.prologue_list(params: [:])) { response in
  234. if let prologueList = try? response.mapArray(PrologueModel.self, atKeyPath: "data.prologues") {
  235. self.prologueList = prologueList
  236. self.updatePrologueUI()
  237. }
  238. } fail: { code, error in
  239. self.view.toast(text: error)
  240. print(error)
  241. }
  242. }
  243. // 选择键盘
  244. func requestChooseKeyboard(keyboardId: String, success: @escaping (() -> Void)) {
  245. var params: [String: Any] = [String: Any]()
  246. params = ["keyboardId": keyboardId]
  247. KeyboardNetworkManager.request(.keyboard_choose(params: params)) { response in
  248. self.view.toast(text: "保存成功")
  249. success()
  250. } fail: { code, error in
  251. self.view.toast(text: error)
  252. print(error)
  253. }
  254. }
  255. // 请求获取超会回
  256. func requestSuperReply(characterId: String, content: String, complete: @escaping ((String) -> ())) {
  257. var params: [String: Any] = [String: Any]()
  258. params = ["keyboardId": self.chooseKeyboard?.id ?? "",
  259. "characterId": characterId,
  260. "content": content]
  261. KeyboardNetworkManager.request(.chat_super_reply(params: params)) { response in
  262. if let contentModel = try? response.mapObject(ReplyModel.self, atKeyPath: "data") {
  263. complete(contentModel.content ?? "")
  264. } else {
  265. complete("")
  266. }
  267. } fail: { code, error in
  268. self.view.toast(text: error)
  269. print(error)
  270. complete("")
  271. }
  272. }
  273. // 请求获取超会说
  274. func requestSuperSpeak(characterId: String, content: String, complete: @escaping (([String]) -> ())) {
  275. var params: [String: Any] = [String: Any]()
  276. params = ["keyboardId": self.chooseKeyboard?.id ?? "",
  277. "characterId": characterId,
  278. "content": content]
  279. KeyboardNetworkManager.request(.chat_super_speak(params: params)) { response in
  280. if let contentModel = try? response.mapObject(SpeakModel.self, atKeyPath: "data"), let list = contentModel.list {
  281. complete(list)
  282. } else {
  283. complete([String]())
  284. }
  285. } fail: { code, error in
  286. self.view.toast(text: error)
  287. print(error)
  288. complete([String]())
  289. }
  290. }
  291. // 请求获取超会说
  292. func requestSuperPrologue(name: String, complete: @escaping (([String]) -> ())) {
  293. var params: [String: Any] = [String: Any]()
  294. params = ["name": name]
  295. KeyboardNetworkManager.request(.chat_super_prologue(params: params)) { response in
  296. if let contentModel = try? response.mapObject(SpeakModel.self, atKeyPath: "data"), let list = contentModel.list {
  297. complete(list)
  298. } else {
  299. complete([String]())
  300. }
  301. } fail: { code, error in
  302. self.view.toast(text: error)
  303. print(error)
  304. complete([String]())
  305. }
  306. }
  307. }
  308. // MARK: - 点击事件
  309. extension KeyboardViewController: KeyboardMenuViewDelegate, KeyboardExchangeViewDelegate {
  310. // 功能按钮选择点击
  311. @objc func functionBtnClickAction() {
  312. KeyboardFunctionPopView.show(view: self.view, selectType: self.chooseType) { type in
  313. self.chooseType = type
  314. }
  315. }
  316. // 菜单按钮点击
  317. @objc func menuBtnClickAction() {
  318. clearPopView()
  319. self.view.addSubview(menuView)
  320. menuView.snp.makeConstraints { make in
  321. make.left.right.bottom.equalTo(0)
  322. make.top.equalTo(menuBtn.snp.bottom)
  323. }
  324. }
  325. // 菜单按钮返回
  326. func menuBackBtnClickAction() {
  327. clearPopView()
  328. self.nowShowView?.isHidden = false
  329. }
  330. // 选择键盘按钮点击
  331. @objc func changeBtnClickAction() {
  332. clearPopView()
  333. self.exchangeView.keyboardList = self.keyboardList
  334. self.exchangeView.isHidden = false
  335. }
  336. // 选择键盘后返回
  337. func exchangeViewBackClickAction() {
  338. clearPopView()
  339. self.nowShowView?.isHidden = false
  340. }
  341. // 点击保存按钮
  342. func exchangeViewSaveClickAction(keyboardList: [KeyboardModel], success: @escaping (() -> ())) {
  343. var keyboardId = ""
  344. for keyboard in keyboardList {
  345. if keyboard.isChoose == true {
  346. keyboardId = keyboard.id ?? ""
  347. break
  348. }
  349. }
  350. requestChooseKeyboard(keyboardId: keyboardId) {
  351. self.keyboardList = keyboardList
  352. for keyboard in keyboardList {
  353. if keyboard.isChoose == true {
  354. self.chooseKeyboard = keyboard
  355. break
  356. }
  357. }
  358. success()
  359. self.userChangeLabel.text = self.chooseKeyboard?.name
  360. self.clearPopView()
  361. self.nowShowView?.isHidden = false
  362. }
  363. }
  364. }
  365. extension KeyboardViewController: KeyboardHelpViewDelegate, KeyboardTeachViewDelegate, KeyboardPrologueViewDelegate {
  366. // 帮聊点击cell
  367. func helpCollectionViewDidSelectItem(characterId: String, content: String, complete: @escaping (() -> ())) {
  368. self.requestSuperReply(characterId: characterId, content: content) { text in
  369. self.insertText(text)
  370. complete()
  371. }
  372. }
  373. // 教你说点击cell
  374. func teachCollectionViewDidSelectItem(characterId: String, content: String, complete: @escaping (([String]) -> ())) {
  375. self.requestSuperSpeak(characterId: characterId, content: content) { list in
  376. complete(list)
  377. }
  378. }
  379. // 教你说点击 TableViewCell
  380. func teachTableViewDidSelectItem(content: String) {
  381. self.insertText(content)
  382. }
  383. // 开场白点击cell
  384. func prologueCollectionViewDidSelectItem(name: String, complete: @escaping (([String]) -> ())) {
  385. self.requestSuperPrologue(name: name) { list in
  386. complete(list)
  387. }
  388. }
  389. // 开场白点击 TableViewCell
  390. func prologueTableViewDidSelectItem(content: String) {
  391. self.insertText(content)
  392. }
  393. }
  394. // MARK: - 处理键盘操作
  395. extension KeyboardViewController: KeyboardBaseViewDelegate {
  396. // 插入文字
  397. func insertText(_ text: String) {
  398. self.textDocumentProxy.insertText(text)
  399. }
  400. // 点击粘贴按钮
  401. func pasteBtnClickAction() {
  402. detectPasteboardPermissionAlert { isShowing in
  403. if isShowing {
  404. print("系统正在显示剪贴板权限弹窗")
  405. self.view.toast(text: "请允许访问剪贴板")
  406. }
  407. if let content = self.getPasteboardContent() {
  408. print("获取到剪贴板内容: \(content)")
  409. self.view.toast(text: "获取到剪贴板内容")
  410. self.helpView.setPasteStr(content: content)
  411. self.teachView.setPasteStr(content: content)
  412. } else {
  413. print("无法获取剪贴板内容")
  414. self.view.toast(text: "无法获取剪贴板内容")
  415. }
  416. }
  417. }
  418. // 删除按钮
  419. func deleteBtnClickAction() {
  420. self.textDocumentProxy.deleteBackward()
  421. }
  422. // 清除按钮
  423. func clearBtnClickAction() {
  424. // 获取当前文本
  425. let proxy = self.textDocumentProxy
  426. // 清空所有文本
  427. for _ in 0..<100 {
  428. proxy.deleteBackward()
  429. }
  430. }
  431. // 发送按钮
  432. func sendBtnClickAction() {
  433. self.textDocumentProxy.insertText("\n")
  434. }
  435. func deleteBtnLongPressBegin() {
  436. // 停止已有的定时器
  437. stopContinuousDelete()
  438. // 创建新的定时器,初始间隔为0.5秒
  439. deleteTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(continuousDeleteAction), userInfo: nil, repeats: false)
  440. }
  441. func deleteBtnLongPressEnd() {
  442. stopContinuousDelete()
  443. }
  444. // 停止删除
  445. func stopContinuousDelete() {
  446. deleteTimer?.invalidate()
  447. deleteTimer = nil
  448. deleteAcceleration = 0.1 // 重置加速度
  449. }
  450. @objc func continuousDeleteAction() {
  451. // 执行删除操作
  452. self.textDocumentProxy.deleteBackward()
  453. // 停止当前定时器
  454. deleteTimer?.invalidate()
  455. // 加速删除(最快0.05秒一次)
  456. let newInterval = max(0.05, 0.5 - deleteAcceleration)
  457. deleteAcceleration += 0.05 // 每次加速0.05秒
  458. // 创建新的更快的定时器
  459. deleteTimer = Timer.scheduledTimer(timeInterval: newInterval, target: self, selector: #selector(continuousDeleteAction), userInfo: nil, repeats: false)
  460. }
  461. // 监听剪贴板变化
  462. func startMonitoringPasteboard() {
  463. // 记录当前剪贴板变化计数
  464. var initialChangeCount = UIPasteboard.general.changeCount
  465. // 记录上一次的剪贴板内容
  466. var lastPasteboardContent: String? = UIPasteboard.general.string
  467. // 创建定时器定期检查剪贴板变化
  468. Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] timer in
  469. guard let self = self else {
  470. timer.invalidate()
  471. return
  472. }
  473. let currentChangeCount = UIPasteboard.general.changeCount
  474. if currentChangeCount != initialChangeCount {
  475. // 剪贴板计数已变化,检查内容是否真的变化
  476. if let copiedString = UIPasteboard.general.string {
  477. // 只有当内容真的不同时才处理
  478. if !copiedString.isEmpty {
  479. print("检测到新复制的内容: \(copiedString)")
  480. // 更新记录的内容和计数
  481. lastPasteboardContent = copiedString
  482. initialChangeCount = currentChangeCount
  483. // 处理复制的内容
  484. self.handleCopiedContent(copiedString)
  485. } else {
  486. // 内容相同或为空,只更新计数
  487. initialChangeCount = currentChangeCount
  488. print("剪贴板计数变化但内容未变或为空")
  489. }
  490. } else {
  491. // 剪贴板内容为nil,更新计数
  492. initialChangeCount = currentChangeCount
  493. lastPasteboardContent = nil
  494. print("剪贴板内容被清空")
  495. }
  496. }
  497. }
  498. }
  499. // 处理复制的内容
  500. func handleCopiedContent(_ content: String) {
  501. self.helpView.setPasteStr(content: content)
  502. self.teachView.setPasteStr(content: content)
  503. }
  504. // 检查键盘权限
  505. func checkPasteboardPermission() -> Bool {
  506. var hasPasteboardPermission = false
  507. // iOS 14及以上版本需要检查权限
  508. if #available(iOS 14.0, *) {
  509. // 尝试读取剪贴板内容来检查权限
  510. let pasteboard = UIPasteboard.general
  511. if let _ = pasteboard.string {
  512. hasPasteboardPermission = true
  513. print("键盘扩展有剪贴板访问权限")
  514. } else {
  515. hasPasteboardPermission = false
  516. print("键盘扩展没有剪贴板访问权限")
  517. }
  518. } else {
  519. // iOS 14以下版本默认有权限
  520. hasPasteboardPermission = true
  521. }
  522. return hasPasteboardPermission
  523. }
  524. // 检测系统是否弹出剪贴板权限弹窗
  525. func detectPasteboardPermissionAlert(completion: @escaping (Bool) -> Void) {
  526. // 记录访问前的时间
  527. let startTime = Date()
  528. // 尝试访问剪贴板
  529. let _ = UIPasteboard.general.string
  530. // 检查访问后的时间延迟
  531. let timeDelay = Date().timeIntervalSince(startTime)
  532. // 如果访问剪贴板的时间超过一定阈值,可能是因为系统弹出了权限弹窗
  533. // 通常正常访问剪贴板的时间应该很短,如果超过100毫秒,可能是弹出了弹窗
  534. if timeDelay > 0.1 {
  535. completion(true)
  536. } else {
  537. completion(false)
  538. }
  539. }
  540. // 获取剪贴板内容
  541. func getPasteboardContent() -> String? {
  542. let pasteboard = UIPasteboard.general
  543. return pasteboard.string
  544. }
  545. }
  546. extension KeyboardViewController {
  547. // 关闭其他弹出页
  548. func clearPopView() {
  549. self.menuView.removeFromSuperview()
  550. self.exchangeView.isHidden = true
  551. self.helpView.isHidden = true
  552. self.teachView.isHidden = true
  553. self.prologueView.isHidden = true
  554. }
  555. // 更新主要界面
  556. func updateMainViewUI() {
  557. clearPopView()
  558. switch chooseType {
  559. case .help:
  560. // self.helpView.characterList = self.characterList
  561. self.helpView.isHidden = false
  562. self.nowShowView = self.helpView
  563. self.functionLabel.text = "帮聊"
  564. break
  565. case .teach:
  566. // self.teachView.characterList = self.characterList
  567. self.teachView.isHidden = false
  568. self.nowShowView = self.teachView
  569. self.functionLabel.text = "教你说"
  570. break
  571. case .prologue:
  572. self.prologueView.isHidden = false
  573. self.nowShowView = self.prologueView
  574. self.functionLabel.text = "开场白"
  575. break
  576. }
  577. }
  578. // 更新人设列表
  579. func updateCharacterUI() {
  580. self.helpView.characterList = self.characterList
  581. self.teachView.characterList = self.characterList
  582. }
  583. // 更新开场白
  584. func updatePrologueUI() {
  585. self.prologueView.prologueList = self.prologueList
  586. }
  587. // 更新键盘选择按钮
  588. func updateUserChangeBtnUI() {
  589. if self.keyboardList?.count == 1 {
  590. self.keyboardList?[0].isChoose = true
  591. self.chooseKeyboard = self.keyboardList?.first
  592. } else {
  593. if let keyboardList = self.keyboardList {
  594. for keyboard in keyboardList {
  595. if keyboard.isChoose == true {
  596. self.chooseKeyboard = keyboard
  597. }
  598. }
  599. }
  600. }
  601. if let chooseKeyboard = self.chooseKeyboard {
  602. self.userChangeLabel.text = chooseKeyboard.name
  603. }
  604. }
  605. func setUI() {
  606. self.view.addSubview(bgImageView)
  607. bgImageView.snp.makeConstraints { make in
  608. make.edges.equalToSuperview()
  609. }
  610. self.view.addSubview(menuBtn)
  611. menuBtn.snp.makeConstraints { make in
  612. make.size.equalTo(CGSize(width: 32, height: 32))
  613. make.left.equalTo(13)
  614. make.top.equalTo(17)
  615. }
  616. self.view.addSubview(heartAnimation)
  617. heartAnimation.snp.makeConstraints { make in
  618. make.size.equalTo(CGSize(width: 35, height: 30))
  619. make.right.equalTo(-10)
  620. make.centerY.equalTo(menuBtn.snp.centerY)
  621. }
  622. heartAnimation.play()
  623. self.view.addSubview(exchangeBtn)
  624. exchangeBtn.snp.makeConstraints { make in
  625. make.size.equalTo(CGSize(width: 34, height: 34))
  626. make.right.equalTo(heartAnimation.snp.left).offset(-10)
  627. make.centerY.equalTo(menuBtn.snp.centerY)
  628. }
  629. self.view.addSubview(teachView)
  630. teachView.snp.makeConstraints { make in
  631. make.left.right.bottom.equalTo(0)
  632. make.top.equalTo(60)
  633. }
  634. self.view.addSubview(helpView)
  635. helpView.snp.makeConstraints { make in
  636. make.left.right.bottom.equalTo(0)
  637. make.top.equalTo(60)
  638. }
  639. self.view.addSubview(prologueView)
  640. prologueView.snp.makeConstraints { make in
  641. make.left.right.bottom.equalTo(0)
  642. make.top.equalTo(menuBtn.snp.bottom)
  643. }
  644. self.view.addSubview(chooseView)
  645. chooseView.snp.makeConstraints { make in
  646. make.width.equalTo(147)
  647. make.height.equalTo(34)
  648. make.left.equalTo(menuBtn.snp.right).offset(9)
  649. make.centerY.equalTo(menuBtn.snp.centerY)
  650. }
  651. self.view.addSubview(exchangeView)
  652. exchangeView.snp.makeConstraints { make in
  653. make.top.equalTo(menuBtn.snp.bottom)
  654. make.left.right.bottom.equalTo(0)
  655. }
  656. chooseView.addSubview(functionView)
  657. functionView.snp.makeConstraints { make in
  658. make.top.left.equalTo(1)
  659. make.bottom.equalTo(-1)
  660. make.width.equalTo(85)
  661. }
  662. functionView.addSubview(functionLabel)
  663. functionLabel.snp.makeConstraints { make in
  664. make.left.equalTo(12)
  665. make.centerY.equalToSuperview()
  666. }
  667. functionView.addSubview(arrowIcon)
  668. arrowIcon.snp.makeConstraints { make in
  669. make.size.equalTo(CGSize(width: 18, height: 18))
  670. make.centerY.equalToSuperview()
  671. make.right.equalTo(-5)
  672. }
  673. chooseView.addSubview(userChangeView)
  674. userChangeView.snp.makeConstraints { make in
  675. make.left.equalTo(functionView.snp.right)
  676. make.right.equalToSuperview()
  677. make.top.bottom.equalTo(0)
  678. }
  679. userChangeView.addSubview(userChangeIcon)
  680. userChangeIcon.snp.makeConstraints { make in
  681. make.size.equalTo(CGSize(width: 12, height: 12))
  682. make.centerY.equalToSuperview()
  683. make.right.equalTo(-8)
  684. }
  685. userChangeView.addSubview(userChangeLabel)
  686. userChangeLabel.snp.makeConstraints { make in
  687. make.right.equalTo(userChangeIcon.snp.left).offset(-4)
  688. make.left.equalTo(4)
  689. make.centerY.equalToSuperview()
  690. }
  691. // chooseView.addSubview(userChangeBtn)
  692. // userChangeBtn.snp.makeConstraints { make in
  693. // make.left.equalTo(functionView.snp.right)
  694. // make.right.equalToSuperview()
  695. // make.top.bottom.equalTo(0)
  696. // }
  697. self.nowShowView = self.helpView
  698. }
  699. }