INPhotoVideosController.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. //
  2. // INPhotoVideosController.swift
  3. // Introduce
  4. //
  5. // Created by 胡志强 on 2021/11/29.
  6. //
  7. import BFCommonKit
  8. import BFMaterialKit
  9. import BFRecordScreenKit
  10. import BFUIKit
  11. import Foundation
  12. import Photos
  13. import UIKit
  14. class INPhotoVideosController: BFBaseViewController {
  15. var chosedAsset: [PHAsset]?
  16. // 按钮高
  17. let choseBtnH: CGFloat = cDefaultMargin * 3
  18. // 按钮宽
  19. let choseBtnW: CGFloat = cDefaultMargin * 5
  20. // 间隔
  21. let margin: CGFloat = 12
  22. lazy var albumController: BFPhotoAlbumController = {
  23. let albumController = BFPhotoAlbumController()
  24. albumController.mediaType = .all
  25. albumController.showGIF = false
  26. albumController.isTopShow = true
  27. albumController.categoryH = cDefaultMargin * 40
  28. addChild(albumController)
  29. view.insertSubview(albumController.view, belowSubview: navHeadImageView!)
  30. albumController.updateViewFrame(frame: CGRect(x: 0, y: navHeadImageView?.frame.maxY ?? cDevice_iPhoneNavBarAndStatusBarHei, width: view.frame.width, height: view.frame.height - (navHeadImageView?.frame.maxY ?? cDevice_iPhoneNavBarAndStatusBarHei)))
  31. albumController.selectedHandle = { [weak self] seletedData in
  32. if seletedData != nil {
  33. self?.albumSelectedHandle(seletedData: seletedData)
  34. } else {
  35. self?.changeCollecBtn.isSelected = false
  36. }
  37. }
  38. return albumController
  39. }()
  40. lazy var changeCollecBtn: UIButton = {
  41. let changeCollecBtn = UIButton(frame: CGRect(x: cDefaultMargin * 5, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth - cDefaultMargin * 10, height: cDefaultMargin * 4))
  42. changeCollecBtn.titleLabel?.lineBreakMode = .byTruncatingTail
  43. changeCollecBtn.tintColor = BFConfig.shared.styleTitleColor
  44. changeCollecBtn.setTitle("我的相册", for: .normal)
  45. changeCollecBtn.setImage(UIImage.moduleImage(named: "icon_selected_down", moduleName: "BFMaterialKit", isAssets: false)?.withRenderingMode(.alwaysTemplate), for: .normal)
  46. changeCollecBtn.setImage(UIImage.moduleImage(named: "icon_selected_up", moduleName: "BFMaterialKit", isAssets: false)?.withRenderingMode(.alwaysTemplate), for: .selected)
  47. changeCollecBtn.setTitleColor(BFConfig.shared.styleTitleColor, for: .normal)
  48. changeCollecBtn.titleLabel?.font = UIFont.systemFont(ofSize: 18, weight: .medium)
  49. changeCollecBtn.tag = 1
  50. changeCollecBtn.imagePosition(at: PQButtonImageEdgeInsetsStyle.right, space: cDefaultMargin / 2)
  51. changeCollecBtn.addTarget(self, action: #selector(btnClick(sender:)), for: .touchUpInside)
  52. return changeCollecBtn
  53. }()
  54. lazy var choseLocalAllBtn: UIButton = {
  55. let choseLocalAllBtn = UIButton(frame: CGRect(x: (view.frame.width - choseBtnW * 3) / 4, y: cDevice_iPhoneNavBarAndStatusBarHei + margin, width: choseBtnW, height: choseBtnH))
  56. choseLocalAllBtn.setTitleColor(UIColor.hexColor(hexadecimal: "#999999"), for: .normal)
  57. choseLocalAllBtn.setTitleColor(BFConfig.shared.styleTitleColor, for: .selected)
  58. choseLocalAllBtn.setTitle("全部", for: .normal)
  59. choseLocalAllBtn.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .medium)
  60. choseLocalAllBtn.addCorner(corner: 6)
  61. choseLocalAllBtn.tag = 10
  62. choseLocalAllBtn.isSelected = true
  63. choseLocalAllBtn.addTarget(self, action: #selector(btnClick(sender:)), for: .touchUpInside)
  64. return choseLocalAllBtn
  65. }()
  66. lazy var choseLocalVideoBtn: UIButton = {
  67. let choseLocalVideoBtn = UIButton(frame: CGRect(x: choseLocalAllBtn.frame.maxX + (view.frame.width - choseBtnW * 3) / 4, y: choseLocalAllBtn.frame.minY, width: choseBtnW, height: choseBtnH))
  68. choseLocalVideoBtn.setTitleColor(UIColor.hexColor(hexadecimal: "#999999"), for: .normal)
  69. choseLocalVideoBtn.setTitleColor(BFConfig.shared.styleTitleColor, for: .selected)
  70. choseLocalVideoBtn.setTitle("视频", for: .normal)
  71. choseLocalVideoBtn.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .medium)
  72. choseLocalVideoBtn.addCorner(corner: 6)
  73. choseLocalVideoBtn.tag = 11
  74. choseLocalVideoBtn.addTarget(self, action: #selector(btnClick(sender:)), for: .touchUpInside)
  75. return choseLocalVideoBtn
  76. }()
  77. lazy var choseLocalImageBtn: UIButton = {
  78. let choseLocalImageBtn = UIButton(frame: CGRect(x: choseLocalVideoBtn.frame.maxX + (view.frame.width - choseBtnW * 3) / 4, y: choseLocalAllBtn.frame.minY, width: choseBtnW, height: choseBtnH))
  79. choseLocalImageBtn.setTitleColor(UIColor.hexColor(hexadecimal: "#999999"), for: .normal)
  80. choseLocalImageBtn.setTitleColor(BFConfig.shared.styleTitleColor, for: .selected)
  81. choseLocalImageBtn.setTitle("照片", for: .normal)
  82. choseLocalImageBtn.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .medium)
  83. choseLocalImageBtn.addCorner(corner: 6)
  84. choseLocalImageBtn.tag = 12
  85. choseLocalImageBtn.addTarget(self, action: #selector(btnClick(sender:)), for: .touchUpInside)
  86. return choseLocalImageBtn
  87. }()
  88. lazy var choseLineView: UIView = {
  89. let choseLineView = UIView(frame: CGRect(x: 0, y: 0, width: 25, height: 3))
  90. choseLineView.frame.origin.y = (navHeadImageView?.frame.maxY ?? 0) - 6
  91. choseLineView.center.x = choseLocalVideoBtn.center.x
  92. choseLineView.backgroundColor = UIColor.hexColor(hexadecimal: BFConfig.shared.styleColor.rawValue)
  93. return choseLineView
  94. }()
  95. lazy var photoMaterialVc: BFPhotosMaterialController = {
  96. let vc = BFPhotosMaterialController()
  97. vc.maxChoseNum = 20
  98. vc.msgType = .all
  99. vc.showGIF = false
  100. vc.view.backgroundColor = .black
  101. vc.updateFrame(newFrame: CGRect(x: 0, y: navHeadImageView?.bottomY ?? 0, width: cScreenWidth, height: cScreenHeigth - cDevice_iPhoneTabBarHei - (navHeadImageView?.bottomY ?? 0)))
  102. vc.selectedMaterialHandle = { [weak self] materialData, selectedPhotoData, _, _ in
  103. self?.chosedAsset = selectedPhotoData
  104. }
  105. vc.detailMaterialHandle = { [weak self] _, currentMaterialData in
  106. let detailVc: BFMaterialDetailController = BFMaterialDetailController()
  107. detailVc.isShowNextBtn = true
  108. detailVc.maxChoseNum = 20
  109. detailVc.isStuckPoint = true
  110. detailVc.canChose = (self?.chosedAsset?.count ?? 0 < 20)
  111. detailVc.materialDetailClickHandle = { [weak self] isMaterialSelected, materialData in
  112. if isMaterialSelected != materialData?.isSelected {
  113. self?.photoMaterialVc.updateMaterials(isSelected:!(isMaterialSelected ?? false), materialData: materialData)
  114. }
  115. }
  116. detailVc.nextClickHandle = {[weak self] sender in
  117. self?.nextBtnClick(sender: sender)
  118. }
  119. if !(currentMaterialData?.isSelected ?? false) {
  120. currentMaterialData?.selectedIndex = (self?.chosedAsset?.count ?? 0) + 1
  121. }
  122. detailVc.materialData = currentMaterialData
  123. self?.navigationController?.pushViewController(detailVc, animated: true)
  124. }
  125. vc.emptyRefreshHandle = {[weak self] msgType in
  126. if msgType == .image {
  127. self?.btnClick(sender: self?.choseLocalVideoBtn)
  128. } else {
  129. self?.btnClick(sender: self?.choseLocalImageBtn)
  130. }
  131. }
  132. return vc
  133. }()
  134. // MARK: - 生命周期
  135. override func viewWillAppear(_ animated: Bool) {
  136. super.viewWillAppear(animated)
  137. showNavigation()
  138. photoMaterialVc.hiddenNavigation()
  139. // 清理cache文件
  140. clearCacheFile(at: exportVideosDirectory)
  141. clearCacheFile(at: exportAudiosDirectory)
  142. }
  143. override func viewDidLoad() {
  144. super.viewDidLoad()
  145. leftButton(image: nil, imageName: nil, tintColor: .white)
  146. navHeadImageView?.backgroundColor = .black
  147. navHeadImageView?.frame.size.height = cDevice_iPhoneNavBarAndStatusBarHei + margin * 2 + choseBtnH
  148. navHeadImageView?.addSubview(changeCollecBtn)
  149. navHeadImageView?.addSubview(choseLocalAllBtn)
  150. navHeadImageView?.addSubview(choseLocalVideoBtn)
  151. navHeadImageView?.addSubview(choseLocalImageBtn)
  152. addChild(photoMaterialVc)
  153. view.addSubview(photoMaterialVc.view)
  154. let bottomV = UIView(frame: CGRect(x: 0, y: cScreenHeigth - cDevice_iPhoneTabBarHei, width: cScreenWidth, height: cDevice_iPhoneTabBarHei))
  155. bottomV.backgroundColor = .black
  156. view.addSubview(bottomV)
  157. let nextBtn = UIButton(type: .custom)
  158. nextBtn.frame = CGRect(x: cScreenWidth - 94, y: 10, width: 78, height: 36)
  159. nextBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#389AFF")
  160. nextBtn.setTitle("下一步", for: .normal)
  161. nextBtn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
  162. nextBtn.layer.cornerRadius = 4
  163. nextBtn.addTarget(self, action: #selector(nextBtnClick(sender:)), for: .touchUpInside)
  164. bottomV.addSubview(nextBtn)
  165. }
  166. // MARK: - 按钮点击事件
  167. /// - Parameter sender: <#sender description#>
  168. /// - Returns: <#description#>
  169. @objc func btnClick(sender: UIButton?) {
  170. switch sender?.tag {
  171. case 1: // 选择图库
  172. sender?.isSelected = !(sender?.isSelected ?? false)
  173. if sender?.isSelected ?? false {
  174. albumController.showCategoryView()
  175. } else {
  176. albumController.dismissCategoryView()
  177. }
  178. case 10, 11, 12: // 筛选全部图库
  179. if (sender?.tag == choseLocalAllBtn.tag && choseLocalAllBtn.isSelected) ||
  180. (sender?.tag == choseLocalVideoBtn.tag && choseLocalVideoBtn.isSelected) ||
  181. (sender?.tag == choseLocalImageBtn.tag && choseLocalImageBtn.isSelected) {
  182. return
  183. }
  184. choseLocalAllBtn.isSelected = sender?.tag == 10
  185. choseLocalVideoBtn.isSelected = sender?.tag == 11
  186. choseLocalImageBtn.isSelected = sender?.tag == 12
  187. if sender?.tag == 11 {
  188. photoMaterialVc.msgType = .video
  189. } else if sender?.tag == 12 {
  190. photoMaterialVc.msgType = .image
  191. } else {
  192. photoMaterialVc.msgType = .all
  193. }
  194. UIView.animate(withDuration: 0.3, delay: 0, options: .allowUserInteraction) { [weak self] in
  195. self?.choseLineView.center.x = sender?.center.x ?? 0
  196. } completion: { _ in
  197. }
  198. default:
  199. break
  200. }
  201. }
  202. /// 图库选择的回调
  203. /// - Parameter seletedData: <#seletedData description#>
  204. /// - Returns: <#description#>
  205. func albumSelectedHandle(seletedData: PHAsset?) {
  206. changeCollecBtn.isSelected = false
  207. if seletedData != nil {
  208. changeCollecBtn.setTitle(seletedData?.title ?? "全部", for: .normal)
  209. changeCollecBtn.imagePosition(at: PQButtonImageEdgeInsetsStyle.right, space: cDefaultMargin / 2)
  210. photoMaterialVc.assetCollection = seletedData!.assetCollection
  211. }
  212. }
  213. @objc func nextBtnClick(sender _: UIButton) {
  214. if let assets = chosedAsset, assets.count > 0 {
  215. if let totalDura = chosedAsset?.reduce(0.0, { partialResult, phasset in
  216. let dur = (phasset.mediaType == .video) ? phasset.duration : 0
  217. return (partialResult ?? 0.0) + dur
  218. }), totalDura > 7200{
  219. let alertController = UIAlertController(title: nil, message: "素材总时长不能超过2小时", preferredStyle: UIAlertController.Style.alert)
  220. let cancelAction = UIAlertAction(title: "确定", style: .default, handler: nil)
  221. alertController.addAction(cancelAction)
  222. self.present(alertController, animated: true, completion: nil)
  223. return
  224. }
  225. // 判断是否时icloud网络资源
  226. // let arr = assets.filter { asset in
  227. // asset.
  228. // }
  229. //
  230. let vc = INIntroduceController()
  231. vc.assets = assets
  232. navigationController?.pushViewController(vc, animated: true)
  233. } else {
  234. cShowHUB(superView: nil, msg: "需要选择一个视频")
  235. }
  236. }
  237. func clearCacheFile(at folderPath: String) {
  238. if let files = try? FileManager.default.contentsOfDirectory(atPath: folderPath) {
  239. for file in files {
  240. do {
  241. try FileManager.default.removeItem(at: URL(fileURLWithPath: folderPath).appendingPathComponent(file))
  242. } catch {
  243. BFLog(1, message: "\(error), \(file)")
  244. }
  245. }
  246. }
  247. }
  248. // MARK: -
  249. override open var preferredStatusBarStyle: UIStatusBarStyle {
  250. return .lightContent
  251. }
  252. }