INPhotoVideosController.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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 * 9
  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("album_title".BFLocale, 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("album_all".BFLocale, 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("album_video".BFLocale , 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("album_album".BFLocale, 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.showGIF = false
  99. vc.view.backgroundColor = .black
  100. vc.updateFrame(newFrame: CGRect(x: 0, y: navHeadImageView?.bottomY ?? 0, width: cScreenWidth, height: cScreenHeigth - cDevice_iPhoneTabBarHei - (navHeadImageView?.bottomY ?? 0)))
  101. vc.selectedMaterialHandle = { [weak self] materialData, selectedPhotoData, _, _ in
  102. self?.chosedAsset = selectedPhotoData
  103. }
  104. vc.detailMaterialHandle = { [weak self] _, currentMaterialData in
  105. let detailVc: BFMaterialDetailController = BFMaterialDetailController()
  106. detailVc.isShowNextBtn = true
  107. detailVc.maxChoseNum = 20
  108. detailVc.isStuckPoint = true
  109. detailVc.materialDetailClickHandle = { [weak self] isMaterialSelected, materialData in
  110. if isMaterialSelected != materialData?.isSelected {
  111. self?.photoMaterialVc.updateMaterials(isSelected:!(isMaterialSelected ?? false), materialData: materialData)
  112. }
  113. }
  114. detailVc.nextClickHandle = {[weak self] sender in
  115. self?.nextBtnClick(sender: sender)
  116. }
  117. if !(currentMaterialData?.isSelected ?? false) {
  118. currentMaterialData?.selectedIndex = (self?.chosedAsset?.count ?? 0) + 1
  119. }
  120. detailVc.materialData = currentMaterialData
  121. self?.navigationController?.pushViewController(detailVc, animated: true)
  122. }
  123. vc.emptyRefreshHandle = {[weak self] msgType in
  124. if msgType == .image {
  125. self?.btnClick(sender: self?.choseLocalVideoBtn)
  126. } else {
  127. self?.btnClick(sender: self?.choseLocalImageBtn)
  128. }
  129. }
  130. return vc
  131. }()
  132. // MARK: - 生命周期
  133. override func viewWillAppear(_ animated: Bool) {
  134. super.viewWillAppear(animated)
  135. showNavigation()
  136. photoMaterialVc.hiddenNavigation()
  137. // 清理cache文件
  138. clearCacheFile(at: exportVideosDirectory)
  139. clearCacheFile(at: exportAudiosDirectory)
  140. }
  141. override func viewDidLoad() {
  142. super.viewDidLoad()
  143. leftButton(image: nil, imageName: nil, tintColor: .white)
  144. navHeadImageView?.backgroundColor = .black
  145. navHeadImageView?.frame.size.height = cDevice_iPhoneNavBarAndStatusBarHei + margin * 2 + choseBtnH
  146. navHeadImageView?.addSubview(changeCollecBtn)
  147. navHeadImageView?.addSubview(choseLocalAllBtn)
  148. navHeadImageView?.addSubview(choseLocalVideoBtn)
  149. navHeadImageView?.addSubview(choseLocalImageBtn)
  150. addChild(photoMaterialVc)
  151. view.addSubview(photoMaterialVc.view)
  152. let bottomV = UIView(frame: CGRect(x: 0, y: cScreenHeigth - cDevice_iPhoneTabBarHei, width: cScreenWidth, height: cDevice_iPhoneTabBarHei))
  153. bottomV.backgroundColor = .black
  154. view.addSubview(bottomV)
  155. let nextBtn = UIButton(type: .custom)
  156. nextBtn.frame = CGRect(x: cScreenWidth - 94, y: 10, width: 78, height: 36)
  157. nextBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#389AFF")
  158. nextBtn.setTitle("option_next".BFLocale, for: .normal)
  159. nextBtn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
  160. nextBtn.layer.cornerRadius = 4
  161. nextBtn.addTarget(self, action: #selector(nextBtnClick(sender:)), for: .touchUpInside)
  162. bottomV.addSubview(nextBtn)
  163. }
  164. // MARK: - 按钮点击事件
  165. /// - Parameter sender: <#sender description#>
  166. /// - Returns: <#description#>
  167. @objc func btnClick(sender: UIButton?) {
  168. switch sender?.tag {
  169. case 1: // 选择图库
  170. sender?.isSelected = !(sender?.isSelected ?? false)
  171. if sender?.isSelected ?? false {
  172. albumController.showCategoryView()
  173. } else {
  174. albumController.dismissCategoryView()
  175. }
  176. case 10, 11, 12: // 筛选全部图库
  177. if (sender?.tag == choseLocalAllBtn.tag && choseLocalAllBtn.isSelected) ||
  178. (sender?.tag == choseLocalVideoBtn.tag && choseLocalVideoBtn.isSelected) ||
  179. (sender?.tag == choseLocalImageBtn.tag && choseLocalImageBtn.isSelected) {
  180. return
  181. }
  182. choseLocalAllBtn.isSelected = sender?.tag == 10
  183. choseLocalVideoBtn.isSelected = sender?.tag == 11
  184. choseLocalImageBtn.isSelected = sender?.tag == 12
  185. if sender?.tag == 11 {
  186. photoMaterialVc.msgType = .video
  187. } else if sender?.tag == 12 {
  188. photoMaterialVc.msgType = .image
  189. } else {
  190. photoMaterialVc.msgType = .all
  191. }
  192. UIView.animate(withDuration: 0.3, delay: 0, options: .allowUserInteraction) { [weak self] in
  193. self?.choseLineView.center.x = sender?.center.x ?? 0
  194. } completion: { _ in
  195. }
  196. default:
  197. break
  198. }
  199. }
  200. /// 图库选择的回调
  201. /// - Parameter seletedData: <#seletedData description#>
  202. /// - Returns: <#description#>
  203. func albumSelectedHandle(seletedData: PHAsset?) {
  204. changeCollecBtn.isSelected = false
  205. if seletedData != nil {
  206. changeCollecBtn.setTitle(seletedData?.title ?? "album_all".BFLocale, for: .normal)
  207. changeCollecBtn.imagePosition(at: PQButtonImageEdgeInsetsStyle.right, space: cDefaultMargin / 2)
  208. photoMaterialVc.assetCollection = seletedData!.assetCollection
  209. }
  210. }
  211. @objc func nextBtnClick(sender _: UIButton) {
  212. if let assets = chosedAsset, assets.count > 0 {
  213. if let totalDura = chosedAsset?.reduce(0.0, { partialResult, phasset in
  214. let dur = (phasset.mediaType == .video) ? phasset.duration : 0
  215. return (partialResult ?? 0.0) + dur
  216. }), totalDura > 7200{
  217. let alertController = UIAlertController(title: nil, message: "album_tips_maxtime".BFLocale, preferredStyle: UIAlertController.Style.alert)
  218. let cancelAction = UIAlertAction(title: "option_ok".BFLocale, style: .default, handler: nil)
  219. alertController.addAction(cancelAction)
  220. self.present(alertController, animated: true, completion: nil)
  221. return
  222. }
  223. // 判断是否时icloud网络资源
  224. // let arr = assets.filter { asset in
  225. // asset.
  226. // }
  227. //
  228. let vc = INIntroduceController()
  229. vc.assets = assets
  230. navigationController?.pushViewController(vc, animated: true)
  231. } else {
  232. cShowHUB(superView: nil, msg: "album_tips_least".BFLocale)
  233. }
  234. }
  235. func clearCacheFile(at folderPath: String) {
  236. if let files = try? FileManager.default.contentsOfDirectory(atPath: folderPath) {
  237. for file in files {
  238. do {
  239. try FileManager.default.removeItem(at: URL(fileURLWithPath: folderPath).appendingPathComponent(file))
  240. } catch {
  241. BFLog(1, message: "\(error), \(file)")
  242. }
  243. }
  244. }
  245. }
  246. // MARK: -
  247. override open var preferredStatusBarStyle: UIStatusBarStyle {
  248. return .lightContent
  249. }
  250. }