TSPTPInputVC.swift 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. //
  2. // TSPTPInputVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/4/7.
  6. //
  7. //import IQKeyboardManagerSwift
  8. import PhotosUI
  9. class TSPTPInputVC: TSBaseVC {
  10. lazy var viewModel: TSPTPInputVM = {
  11. let viewModel = TSPTPInputVM()
  12. viewModel.isCanGennerateBlock = { [weak self] isCan in
  13. guard let self = self else { return }
  14. submitBtn.isEnabled = isCan
  15. }
  16. return viewModel
  17. }()
  18. lazy var photoPickerManager: TSPhotoPickerManager = {
  19. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  20. return photoPickerManager
  21. }()
  22. //###################################### 导航栏 view ######################################
  23. lazy var vipBtn: UIButton = {
  24. let vipBtn = UIButton.createButton(image: UIImage(named: "nav_vip")) { [weak self] in
  25. guard let self = self else { return }
  26. TSPurchaseVC.show(target: self) {}
  27. }
  28. return vipBtn
  29. }()
  30. lazy var navBarView: TSBaseNavContentBarView = {
  31. let navBarView = TSBaseNavContentBarView()
  32. let titleImageView = UIImageView.createImageView(imageName: "nav_title_pic",contentMode: .scaleToFill)
  33. navBarView.barView.addSubview(titleImageView)
  34. titleImageView.snp.makeConstraints { make in
  35. make.centerY.equalToSuperview()
  36. make.left.equalTo(16)
  37. }
  38. // let keyboardBtn = UIButton.createButton(image: UIImage(named: "keyboard")) { [weak self] in
  39. // guard let self = self else { return }
  40. // kPresentModalVC(target: self, modelVC: TSWallpaperVC())
  41. // }
  42. // navBarView.barView.addSubview(keyboardBtn)
  43. // keyboardBtn.snp.makeConstraints { make in
  44. // make.centerY.equalToSuperview()
  45. // make.trailing.equalTo(-16)
  46. // make.width.height.equalTo(24)
  47. // }
  48. navBarView.barView.addSubview(vipBtn)
  49. vipBtn.snp.makeConstraints { make in
  50. make.centerY.equalToSuperview()
  51. make.trailing.equalTo(-16)//(-60)
  52. make.width.height.equalTo(24)
  53. }
  54. return navBarView
  55. }()
  56. //###################################### cusStackView ######################################
  57. lazy var cusStackView: TSCustomStackView = {
  58. let cusStackView = TSCustomStackView(axis: .vertical,spacing: 0)
  59. cusStackView.scrollView.isScrollEnabled = false
  60. return cusStackView
  61. }()
  62. // //###################################### 入口 view ######################################
  63. //
  64. // let bannerY:CGFloat = 17
  65. // let bannerW:CGFloat = 166*kDesignScale
  66. // let bannerH:CGFloat = 117*kDesignScale
  67. // lazy var textToPhotoBannerBtn: UIButton = {
  68. // let textToPhotoBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToPhoto_banner"))
  69. // textToPhotoBannerBtn.addTarget(self, action: #selector(clickTextToPhoto), for: .touchUpInside)
  70. // textToPhotoBannerBtn.frame = CGRect(x: 16, y: bannerY, width: bannerW, height: bannerH)
  71. //
  72. // let label = UILabel.createLabel(text: "Text ➡️ Photo".localized,font: .font(name:.PoppinsBlackItalic,size: 16),textColor: .white)
  73. // textToPhotoBannerBtn.addSubview(label)
  74. // label.snp.makeConstraints { make in
  75. // make.top.equalTo(12)
  76. // make.leading.equalTo(8)
  77. // make.height.equalTo(24)
  78. // }
  79. //
  80. // let button = UIButton.createButton(title:"Try Now".localized,backgroundColor:.white,font: .font(size: 11),titleColor: "#ED69AA".uiColor,corner: 9)
  81. // button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
  82. // textToPhotoBannerBtn.addSubview(button)
  83. // button.snp.makeConstraints { make in
  84. // make.top.equalTo(44)
  85. // make.leading.equalTo(8)
  86. // make.height.equalTo(18)
  87. // }
  88. //
  89. // return textToPhotoBannerBtn
  90. // }()
  91. //
  92. // lazy var textToEmojiBannerBtn: UIButton = {
  93. // let textToEmojiBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToEmoji_banner"))
  94. // textToEmojiBannerBtn.addTarget(self, action: #selector(clickTextToEmoji), for: .touchUpInside)
  95. // let x = textToPhotoBannerBtn.x + textToPhotoBannerBtn.width + 11.0
  96. // textToEmojiBannerBtn.frame = CGRect(x: x, y: bannerY, width: bannerW, height: bannerH)
  97. //
  98. // let color:UIColor = "#7855D6".uiColor
  99. // let label = UILabel.createLabel(text: "Text ➡️ Emoji".localized,font: .font(name:.PoppinsBlackItalic,size: 16),textColor: color)
  100. // textToEmojiBannerBtn.addSubview(label)
  101. // label.snp.makeConstraints { make in
  102. // make.top.equalTo(12)
  103. // make.leading.equalTo(8)
  104. // make.height.equalTo(24)
  105. // }
  106. //
  107. // let button = UIButton.createButton(title:"Try Now".localized,backgroundColor:color,font: .font(size: 11),titleColor: "#D0D5FF".uiColor,corner: 9)
  108. // button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
  109. // textToEmojiBannerBtn.addSubview(button)
  110. // button.snp.makeConstraints { make in
  111. // make.top.equalTo(44)
  112. // make.leading.equalTo(8)
  113. // make.height.equalTo(18)
  114. // }
  115. //
  116. // return textToEmojiBannerBtn
  117. // }()
  118. //
  119. //
  120. // lazy var entranceView: UIView = {
  121. // let entranceView = UIView()
  122. // entranceView.addSubview(textToPhotoBannerBtn)
  123. // entranceView.addSubview(textToEmojiBannerBtn)
  124. // return entranceView
  125. // }()
  126. //###################################### 上传图片 ######################################
  127. lazy var uploadView: TSPTPUploadView = {
  128. let uploadView = TSPTPUploadView()
  129. uploadView.clickHandel = { [weak self] index in
  130. guard let self = self else { return }
  131. if index == 0 {//删除
  132. viewModel.upLoadImage = nil
  133. uploadView.upLoadImage = nil
  134. }else{//添加
  135. if TSAIAgeImageHintVC.isShowUploadImageHint{
  136. TSAIAgeImageHintVC.isShowUploadImageHint = false
  137. presentModalHintVC()
  138. }else {
  139. pickSinglePhoto()
  140. }
  141. }
  142. }
  143. return uploadView
  144. }()
  145. func pickSinglePhoto() {
  146. photoPickerManager.pickSinglePhoto { [weak self] image,phAsset in
  147. guard let self = self else { return }
  148. handleSinglePhoto(image: image, phAsset: phAsset)
  149. }
  150. }
  151. func handleSinglePhoto(image:UIImage?,phAsset:PHAsset?){
  152. let maxSize = 10 * 1024 * 1024
  153. if let image = image,let phAsset = phAsset {
  154. // 方法2:异步获取详细大小(不阻塞主线程)
  155. TSPhotoSizeHelper.getImageFileSizeAsync(asset: phAsset) {[weak self] size in
  156. guard let self = self else { return }
  157. let mbSize = Double(size) / (1024 * 1024)
  158. print("精确大小: \(mbSize) MB,size = \(size)")
  159. if size > maxSize {
  160. TSToastShared.showToast(text: "Photo must be smaller than 10MB.".localized)
  161. }else{
  162. viewModel.upLoadImage = image
  163. uploadView.upLoadImage = image
  164. }
  165. }
  166. }else if let image = image {
  167. if image.isLargerThan(byteSize: maxSize) {
  168. TSToastShared.showToast(text: "Photo must be smaller than 10MB.".localized)
  169. }else{
  170. viewModel.upLoadImage = image
  171. uploadView.upLoadImage = image
  172. }
  173. }
  174. }
  175. //###################################### 选择风格 ######################################
  176. lazy var selectStyleView: TSPTPSelectStyleView = {
  177. let selectStyleView = TSPTPSelectStyleView()
  178. selectStyleView.currentIndexPath = IndexPath(item: viewModel.selectedStyleIndex, section: 0)
  179. selectStyleView.dataArray = viewModel.ptpStyleModels
  180. selectStyleView.clickHandle = { [weak self] model in
  181. guard let self = self else { return }
  182. viewModel.selectedPTPStyleModel = model
  183. updateVipView()
  184. updateTextFiledView()
  185. }
  186. return selectStyleView
  187. }()
  188. //###################################### 输入框 ######################################
  189. private let maxLength = 200 // 最大长度限制
  190. lazy var customTextView: TSPlaceholderTextView = {
  191. let customTextView = TSPlaceholderTextView(
  192. placeholder: "Please describe your photo".localized,
  193. text: "",
  194. font: .font(size: 14),
  195. textColor: .white,
  196. backgroundColor: .clear
  197. )
  198. customTextView.verticalAlignment = .center
  199. customTextView.delegate = self
  200. customTextView.returnKeyType = .send
  201. return customTextView
  202. }()
  203. lazy var clearBtn: UIButton = {
  204. let clearBtn = UIButton.createButton(
  205. image: UIImage(named: "clear_text")
  206. )
  207. { [weak self] in
  208. guard let self = self else { return }
  209. customTextView.text = ""
  210. }
  211. clearBtn.isHidden = true
  212. return clearBtn
  213. }()
  214. var promptTextViewH:CGFloat = 84.0
  215. lazy var promptTextView:UIView = {
  216. let promptTextView = UIView()
  217. promptTextView.clipsToBounds = true
  218. let bgView = UIView()
  219. bgView.backgroundColor = "#333333".uiColor
  220. bgView.cornerRadius = 16.0
  221. promptTextView.addSubview(bgView)
  222. bgView.snp.makeConstraints { make in
  223. make.edges.equalTo(UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16))
  224. }
  225. bgView.addSubview(customTextView)
  226. bgView.addSubview(clearBtn)
  227. customTextView.snp.makeConstraints { make in
  228. make.top.bottom.equalTo(0)
  229. make.centerY.equalToSuperview()
  230. make.leading.equalTo(12.0)
  231. make.trailing.equalTo(-32)
  232. }
  233. clearBtn.snp.makeConstraints { make in
  234. make.centerY.equalToSuperview()
  235. make.width.height.equalTo(16.0)
  236. make.trailing.equalTo(-12)
  237. }
  238. return promptTextView
  239. }()
  240. //###################################### 集合视图 ######################################
  241. let collectionViewBtootm:CGFloat = 80
  242. lazy var collectionComponent: TSCollectionViewComponent = {
  243. let layout = UICollectionViewFlowLayout()
  244. let cp = TSCollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [:])
  245. cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: collectionViewBtootm, right: 0)
  246. // 禁用自动 contentInset 调整
  247. if #available(iOS 11.0, *) {
  248. cp.collectionView.contentInsetAdjustmentBehavior = .never
  249. } else {
  250. automaticallyAdjustsScrollViewInsets = false
  251. }
  252. cp.sectionActionHandler = { [weak self] cellCp, indexPath in
  253. guard let self = self else { return }
  254. if let cmd = cellCp as? String, cmd == "delete" {
  255. showCustomAlert(message: "Are you sure to delete".localized, deleteHandler: {
  256. self.viewModel.removeAllHistoryList()
  257. self.collectionComponent.clear()
  258. self.collectionComponent.reloadView(with: self.viewModel.colDataArray)
  259. })
  260. }
  261. }
  262. cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
  263. guard let self = self else { return }
  264. if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel{
  265. var dataModelArray:[TSGenmojiModel] = []
  266. for itemModel in sections.items {
  267. dataModelArray.append(itemModel.dataModel)
  268. }
  269. let browseVC = TSAIPhotoBrowseVC()
  270. browseVC.dataModelArray = dataModelArray
  271. browseVC.currentIndex = indexPath.item
  272. kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
  273. }
  274. }
  275. return cp
  276. }()
  277. //###################################### 按钮 ######################################
  278. lazy var submitBtn: UIButton = {
  279. let submitBtn = kCreateNormalSubmitBtn(title: getVipText()) { [weak self] in
  280. guard let self = self else { return }
  281. generateImage()
  282. }
  283. submitBtn.cornerRadius = 24.0
  284. submitBtn.isEnabled = false
  285. return submitBtn
  286. }()
  287. override func createView() {
  288. navBarContentView.addSubview(navBarView)
  289. navBarView.snp.makeConstraints { make in
  290. make.edges.equalToSuperview()
  291. }
  292. contentView.addSubview(collectionComponent.collectionView)
  293. collectionComponent.collectionView.snp.makeConstraints { make in
  294. make.edges.equalToSuperview()
  295. }
  296. let tapGesture = UITapGestureRecognizer(target: self, action: #selector(clickView))
  297. tapGesture.cancelsTouchesInView = false
  298. view.addGestureRecognizer(tapGesture)
  299. collectionComponent.clear()
  300. collectionComponent.reloadView(with:viewModel.colDataArray)
  301. contentView.addSubview(submitBtn)
  302. submitBtn.snp.makeConstraints { make in
  303. make.bottom.equalTo(-16)
  304. make.leading.equalTo(16)
  305. make.trailing.equalTo(-16)
  306. make.height.equalTo(48)
  307. }
  308. setUpCusStackView()
  309. // upDateCusStackViewH()
  310. kDelayMainShort {
  311. self.upDateCusStackViewH()
  312. }
  313. }
  314. override func dealThings() {
  315. NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
  316. updateVipView()
  317. TSAIAgeImageHintVC.userDefaultsKey = "isFirstUploadImagePTP"
  318. // collectionViewObserverHandle()
  319. //// // 监听键盘事件
  320. // NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
  321. // NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
  322. }
  323. //
  324. // override func viewWillAppear(_ animated: Bool) {
  325. // super.viewWillAppear(animated)
  326. // IQKeyboardManager.shared.isEnabled = false
  327. // }
  328. // override func viewWillDisappear(_ animated: Bool) {
  329. // super.viewWillDisappear(animated)
  330. //
  331. // IQKeyboardManager.shared.isEnabled = true
  332. // }
  333. private var collectionViewObserver: CollectionViewObserver!
  334. func collectionViewObserverHandle(){
  335. collectionViewObserver = CollectionViewObserver(collectionView: collectionComponent.collectionView)
  336. collectionViewObserver.onContentSizeChange = { size in
  337. print("collectionViewObserver 内容大小变化: \(size)")
  338. }
  339. collectionViewObserver.onContentInsetChange = { inset in
  340. print("collectionViewObserver 内边距变化: \(inset)")
  341. }
  342. collectionViewObserver.onContentOffsetChange = { offset in
  343. print("collectionViewObserver 偏移量变化: \(offset)")
  344. }
  345. }
  346. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  347. print("contentOffset 变化: \(scrollView.contentOffset)")
  348. // 实时监听偏移量变化
  349. }
  350. }
  351. extension TSPTPInputVC {
  352. var cusStackViewH:CGFloat{
  353. get {
  354. if cusStackView.viewH > 0{
  355. dePrint("collectionViewObserver cusStackView.viewH == \(cusStackView.viewH)")
  356. return cusStackView.viewH
  357. }
  358. return 462 //+bannerH+bannerY+promptTextViewH
  359. }
  360. }
  361. func upDateCusStackViewH(){
  362. let cusH = cusStackViewH
  363. self.collectionComponent.collectionView.contentInset = UIEdgeInsets(top: cusH, left: 0, bottom: collectionViewBtootm, right: 0)
  364. cusStackView.snp.remakeConstraints { make in
  365. make.top.equalTo(-cusH)
  366. make.leading.trailing.equalTo(0)
  367. make.height.equalTo(cusH)
  368. }
  369. self.collectionComponent.collectionView.contentOffset = CGPoint(x: 0, y: -cusH)
  370. }
  371. func presentModalHintVC(){
  372. let vc = TSAIAgeImageHintVC()
  373. vc.clickUpImageHandle = { [weak self] image,phAsset in
  374. guard let self = self else { return }
  375. handleSinglePhoto(image: image, phAsset: phAsset)
  376. }
  377. kPresentModalVC(target: self, modelVC: vc,transitionStyle: .crossDissolve)
  378. }
  379. func setUpCusStackView(){
  380. collectionComponent.collectionView.addSubview(cusStackView)
  381. // cusStackView.addSubviewToStack(entranceView)
  382. // entranceView.snp.makeConstraints { make in
  383. // make.height.equalTo(bannerH+bannerY)
  384. // make.width.equalTo(k_ScreenWidth)
  385. // }
  386. let uploadPhotoTitleView = TSTitleView.creatTitleView(title: "Upload Photo".localized, subTitle: "(Size ≤ 10MB)".localized)
  387. cusStackView.addSubviewToStack(uploadPhotoTitleView)
  388. uploadPhotoTitleView.snp.makeConstraints { make in
  389. make.height.equalTo(uploadPhotoTitleView.viewH)
  390. make.width.equalTo(k_ScreenWidth)
  391. }
  392. let hintBtn = TSUIExpandedTouchButton()
  393. hintBtn.setUpButton(image: UIImage(named: "ptp_hint")){ [weak self] in
  394. guard let self = self else { return }
  395. presentModalHintVC()
  396. }
  397. uploadPhotoTitleView.contentView.addSubview(hintBtn)
  398. hintBtn.snp.makeConstraints { make in
  399. make.centerY.equalToSuperview().offset(kSectionTitleViewCenterYOffset)
  400. make.trailing.equalTo(-16)
  401. make.width.height.equalTo(16)
  402. }
  403. cusStackView.addSubviewToStack(uploadView)
  404. uploadView.snp.makeConstraints { make in
  405. make.height.equalTo(uploadView.viewH)
  406. make.width.equalTo(k_ScreenWidth)
  407. }
  408. let selectStyleTitleView = TSTitleView.creatTitleView(title: "Select Style".localized)
  409. cusStackView.addSubviewToStack(selectStyleTitleView)
  410. selectStyleTitleView.snp.makeConstraints { make in
  411. make.height.equalTo(selectStyleTitleView.viewH)
  412. make.width.equalTo(k_ScreenWidth)
  413. }
  414. cusStackView.addSubviewToStack(selectStyleView)
  415. selectStyleView.snp.makeConstraints { make in
  416. make.height.equalTo(selectStyleView.viewH)
  417. make.width.equalTo(k_ScreenWidth)
  418. }
  419. // cusStackView.addSubviewToStack(promptTextView)
  420. // promptTextView.snp.makeConstraints { make in
  421. // make.height.equalTo(promptTextViewH)
  422. // make.width.equalTo(k_ScreenWidth)
  423. // }
  424. }
  425. override func viewDidLayoutSubviews() {
  426. super.viewDidLayoutSubviews()
  427. }
  428. }
  429. extension TSPTPInputVC: UITextViewDelegate{
  430. // 实现 UITextViewDelegate 协议方法,控制 return 键行为
  431. func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
  432. if text == "\n" {
  433. // 当输入为换行符(即按下 return 键)时,执行相应操作
  434. //sendBolck?(textView.text)
  435. return false
  436. }
  437. return true
  438. }
  439. }
  440. extension TSPTPInputVC {
  441. @objc func vipInfoChanged() {
  442. kExecuteOnMainThread {
  443. self.updateVipView()
  444. }
  445. }
  446. func updateVipView() {
  447. kExecuteOnMainThread {
  448. self.vipBtn.isHidden = PurchaseManager.default.isVip
  449. var showVip = kPurchaseDefault.generateVipShow(type: .picToPic)
  450. if showVip == false {
  451. showVip = self.viewModel.selectedPTPStyleModel?.isVip ?? false
  452. }
  453. kSetBtnVipIcon(btn: self.submitBtn, show: showVip)
  454. }
  455. }
  456. func getVipText()->String{
  457. return "Generate".localized
  458. }
  459. func updateTextFiledView () {
  460. // promptTextView.snp.updateConstraints { make in
  461. // make.height.equalTo(viewModel.selectedPTPStyleModel?.style == "No Style" ? promptTextViewH : 0 )
  462. // }
  463. }
  464. }
  465. extension TSPTPInputVC {
  466. // @objc func clickTextToPhoto() {
  467. // kPushVC(target: self, modelVC: TSTextGeneralPictureVC())
  468. // }
  469. //
  470. // @objc func clickTextToEmoji() {
  471. // kPushVC(target: self, modelVC: TSGenmojiVC())
  472. // }
  473. @objc func clickView() {
  474. view.endEditing(true)
  475. }
  476. func generateImage() {
  477. var isVip = kPurchaseDefault.freeNumAvailable(type: .picToPic) == false
  478. if viewModel.selectedPTPStyleModel?.isVip == true {
  479. isVip = true
  480. }
  481. //判断 vip
  482. if kJudgeVip(externalBool: isVip, vc: self) { [weak self] in
  483. guard let self = self else { return }
  484. }{ return }
  485. guard let selectedPTPStyleModel = viewModel.selectedPTPStyleModel else { return }
  486. guard let upLoadImage = viewModel.upLoadImage else { return }
  487. let gennerateVC = TSPTPGeneratorVC(prompt: viewModel.prompt,promptSort: selectedPTPStyleModel.imageText , imageUrl: "",upLoadImage: upLoadImage,style: selectedPTPStyleModel.style) { [weak self] model in
  488. guard let self = self else { return }
  489. if viewModel.saveModel(model:model) {
  490. collectionComponent.clear()
  491. collectionComponent.reloadView(with:viewModel.colDataArray)
  492. }else{
  493. collectionComponent.reloadData()
  494. }
  495. updateVipView()
  496. }
  497. kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
  498. }
  499. }
  500. extension TSPTPInputVC {
  501. @objc func keyboardWillShow(_ notification: Notification) {
  502. guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect,
  503. let animationDuration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else {
  504. return
  505. }
  506. // dePrint("keyboardWillShow contentInset IQKeyboardManager=\(IQKeyboardManager.shared.isEnabled)")
  507. // let keyboardHeight = keyboardFrame.height
  508. // let contentInset = UIEdgeInsets(top:cusStackViewH, left: 0, bottom: keyboardHeight, right: 0)
  509. // dePrint("keyboardWillShow contentInset=\(contentInset)")
  510. //// UIView.animate(withDuration: animationDuration) {
  511. // self.collectionComponent.collectionView.contentInset = contentInset
  512. // self.collectionComponent.collectionView.scrollIndicatorInsets = contentInset
  513. //// }
  514. // kDelayMainShort {
  515. // self.collectionComponent.collectionView.scrollToLastItem(animated: false)
  516. // }
  517. }
  518. @objc func keyboardWillHide(_ notification: Notification) {
  519. guard let animationDuration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else {
  520. return
  521. }
  522. // let contentInset = UIEdgeInsets(top: cusStackViewH, left: 0, bottom: collectionViewBtootm, right: 0)
  523. // dePrint("keyboardWillHide contentInset=\(contentInset)")
  524. //// UIView.animate(withDuration: animationDuration) {
  525. // self.collectionComponent.collectionView.contentInset = contentInset
  526. // self.collectionComponent.collectionView.scrollIndicatorInsets = contentInset
  527. //// }
  528. }
  529. }