From d5fcf1d37c121a5534b525dd852f4e09cf77b9d0 Mon Sep 17 00:00:00 2001 From: bluesea <307723040@qq.com> Date: Fri, 22 Mar 2024 20:08:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A9=BA=E9=97=B4=E7=9B=B8?= =?UTF-8?q?=E5=86=8C=E5=8A=A0=E8=BD=BD=E6=B5=81=E7=A8=8B=EF=BC=8C=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=8D=A1=E9=A1=BF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SwiftProject.xcodeproj/project.pbxproj | 8 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 64 +++ .../SwiftProject/GoogleService-Info.plist | 12 +- SwiftProject/SwiftProject/Info.plist | 2 + .../Project/Controller/CCHomeController.swift | 16 +- .../CCSpatialShootController.swift | 4 +- .../SwiftProject/Project/Util/ZZHHelper.swift | 3 + .../CCSpaceAlbumFilterPopView2.swift | 445 ++++++++++++++++++ .../CCSpaceAlbumFliterPopView.swift | 22 +- 9 files changed, 549 insertions(+), 27 deletions(-) create mode 100644 SwiftProject/SwiftProject/Project/View/Album/CCSpaceAlbumFliterPopView/CCSpaceAlbumFilterPopView2.swift diff --git a/SwiftProject/SwiftProject.xcodeproj/project.pbxproj b/SwiftProject/SwiftProject.xcodeproj/project.pbxproj index 3e1a203..27ae8f7 100644 --- a/SwiftProject/SwiftProject.xcodeproj/project.pbxproj +++ b/SwiftProject/SwiftProject.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 003624662BA3F0AB0080D014 /* ZZHImageExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 003624652BA3F0AB0080D014 /* ZZHImageExtension.swift */; }; 005580782B9F1525004B9567 /* ZZHHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 005580772B9F1525004B9567 /* ZZHHelper.swift */; }; + 009661F82BAD6C7100FCA65F /* CCSpaceAlbumFilterPopView2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009661F72BAD6C7100FCA65F /* CCSpaceAlbumFilterPopView2.swift */; }; + 009661FA2BAD876200FCA65F /* PhotosUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 009661F92BAD876200FCA65F /* PhotosUI.framework */; }; 00B946232B67B26D00DA668F /* ddd_video.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 00B946222B67B26D00DA668F /* ddd_video.mp4 */; }; 00B946252B67B7DE00DA668F /* CCSpatialPlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B946242B67B7DE00DA668F /* CCSpatialPlayView.swift */; }; 00C665732BAA81F900C309C3 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 00C665722BAA81F900C309C3 /* GoogleService-Info.plist */; }; @@ -97,6 +99,8 @@ /* Begin PBXFileReference section */ 003624652BA3F0AB0080D014 /* ZZHImageExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZZHImageExtension.swift; sourceTree = ""; }; 005580772B9F1525004B9567 /* ZZHHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZZHHelper.swift; sourceTree = ""; }; + 009661F72BAD6C7100FCA65F /* CCSpaceAlbumFilterPopView2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCSpaceAlbumFilterPopView2.swift; sourceTree = ""; }; + 009661F92BAD876200FCA65F /* PhotosUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhotosUI.framework; path = System/Library/Frameworks/PhotosUI.framework; sourceTree = SDKROOT; }; 00B946222B67B26D00DA668F /* ddd_video.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = ddd_video.mp4; sourceTree = ""; }; 00B946242B67B7DE00DA668F /* CCSpatialPlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCSpatialPlayView.swift; sourceTree = ""; }; 00C665722BAA81F900C309C3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; @@ -197,6 +201,7 @@ 00EB2D052BA2D59000924D84 /* MessageUI.framework in Frameworks */, 1E277B76988DF1691E8E5A49 /* Pods_SwiftProject.framework in Frameworks */, AF2120D42B4E99FA00400B7F /* MobileCoreServices.framework in Frameworks */, + 009661FA2BAD876200FCA65F /* PhotosUI.framework in Frameworks */, AF2120D62B4E9A0100400B7F /* Photos.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -261,6 +266,7 @@ isa = PBXGroup; children = ( 1EF3B31C2B945C45000BD52D /* CCSpaceAlbumFliterPopView.swift */, + 009661F72BAD6C7100FCA65F /* CCSpaceAlbumFilterPopView2.swift */, ); path = CCSpaceAlbumFliterPopView; sourceTree = ""; @@ -311,6 +317,7 @@ 4D8F3A411661D600CD07B39B /* Frameworks */ = { isa = PBXGroup; children = ( + 009661F92BAD876200FCA65F /* PhotosUI.framework */, 00EB2D042BA2D59000924D84 /* MessageUI.framework */, AF478B022B577D51005C35A5 /* AVFoundation.framework */, AF2120D52B4E9A0100400B7F /* Photos.framework */, @@ -672,6 +679,7 @@ 1E1EA2902B933C8200A5D5D2 /* VideoWriter.swift in Sources */, AF2120E62B4E9DE000400B7F /* CCTableSwitchView.swift in Sources */, 00D33BFA2B9AB21A00604A44 /* ZZHAVExtension.swift in Sources */, + 009661F82BAD6C7100FCA65F /* CCSpaceAlbumFilterPopView2.swift in Sources */, AF2120E02B4E9C8000400B7F /* Timer+Add.swift in Sources */, AF2120DE2B4E9C3500400B7F /* AppDelegate+Add.swift in Sources */, 1EFB8C6E2B88D9D800C72119 /* CCBottomMenuPopView.swift in Sources */, diff --git a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 1ee42cf..e707470 100644 --- a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -745,5 +745,69 @@ + + + + + + + + + + + + + + diff --git a/SwiftProject/SwiftProject/GoogleService-Info.plist b/SwiftProject/SwiftProject/GoogleService-Info.plist index abbe890..630f8ca 100644 --- a/SwiftProject/SwiftProject/GoogleService-Info.plist +++ b/SwiftProject/SwiftProject/GoogleService-Info.plist @@ -15,16 +15,16 @@ STORAGE_BUCKET vpro-76262.appspot.com IS_ADS_ENABLED - + IS_ANALYTICS_ENABLED - + IS_APPINVITE_ENABLED - + IS_GCM_ENABLED - + IS_SIGNIN_ENABLED - + GOOGLE_APP_ID 1:931841718963:ios:164e5422a1c3f669d04ec6 - \ No newline at end of file + diff --git a/SwiftProject/SwiftProject/Info.plist b/SwiftProject/SwiftProject/Info.plist index 6a6654d..5347efe 100644 --- a/SwiftProject/SwiftProject/Info.plist +++ b/SwiftProject/SwiftProject/Info.plist @@ -2,6 +2,8 @@ + FirebaseAutomaticScreenReportingEnabled + NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/SwiftProject/SwiftProject/Project/Controller/CCHomeController.swift b/SwiftProject/SwiftProject/Project/Controller/CCHomeController.swift index eb57719..d76577a 100644 --- a/SwiftProject/SwiftProject/Project/Controller/CCHomeController.swift +++ b/SwiftProject/SwiftProject/Project/Controller/CCHomeController.swift @@ -52,8 +52,8 @@ class CCHomeController: BaseController, LLCycleScrollViewDelegate,MFMailComposeV let kNowTimeToUserDefaultKey_Home:String = "kNowTimeToUserDefaultKey_Home" - lazy var spaceAlbumPopView: CCSpaceAlbumFliterPopView = { - let view = CCSpaceAlbumFliterPopView.init(frame: CGRectMake(0, 0, KScreenWidth, KScreenHeight)) + lazy var spaceAlbumPopView: CCSpaceAlbumFilterPopView2 = { + let view = CCSpaceAlbumFilterPopView2.init(frame: CGRectMake(0, 0, KScreenWidth, KScreenHeight)) return view }() @@ -315,26 +315,26 @@ class CCHomeController: BaseController, LLCycleScrollViewDelegate,MFMailComposeV }else if sender.tag == 22 { //VR预览 - - let view = CCSpaceAlbumFliterPopView.init(frame: CGRectMake(0, 0, KScreenWidth, KScreenHeight)) + + let view = CCSpaceAlbumFilterPopView2.init(frame: CGRectMake(0, 0, KScreenWidth, KScreenHeight)) KWindow?.addSubview(view) view.show() //选择图片 - view.selectedImageHandler = { [self] data,asset in + view.selectedImageHandler = { [weak self] data,asset in print("回调") let vc = CCSpatialPhotoDisplayController() vc.photoOriginalData = data vc.imageAsset = asset - self.navigationController?.pushViewController(vc, animated: true) + self?.navigationController?.pushViewController(vc, animated: true) } //选择视频 - view.selectedVideoHandler = { url,asset in + view.selectedVideoHandler = {[weak self] url,asset in let vc = CCSpatialVideoDisplayController() vc.sourceVideoURL = url vc.videoOriginalPHAsset = asset - self.navigationController?.pushViewController(vc, animated: true) + self?.navigationController?.pushViewController(vc, animated: true) } diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialShootController.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialShootController.swift index 25471f0..0c407f9 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialShootController.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialShootController.swift @@ -48,8 +48,8 @@ class CCSpatialShootController: BaseController { //记录拍摄时长 var timer: Timer? - lazy var spaceAlbumPopView: CCSpaceAlbumFliterPopView = { - let view = CCSpaceAlbumFliterPopView.init(frame: CGRectMake(0, 0, KScreenWidth, KScreenHeight)) + lazy var spaceAlbumPopView: CCSpaceAlbumFilterPopView2 = { + let view = CCSpaceAlbumFilterPopView2.init(frame: CGRectMake(0, 0, KScreenWidth, KScreenHeight)) return view }() diff --git a/SwiftProject/SwiftProject/Project/Util/ZZHHelper.swift b/SwiftProject/SwiftProject/Project/Util/ZZHHelper.swift index c474479..17d21bb 100644 --- a/SwiftProject/SwiftProject/Project/Util/ZZHHelper.swift +++ b/SwiftProject/SwiftProject/Project/Util/ZZHHelper.swift @@ -35,6 +35,9 @@ class ZZHHelper { } } + + + //MARK: 检查是否为空间视频 class func isSpatialVideo(asset: AVAsset) -> Bool { // for track in asset.tracks { diff --git a/SwiftProject/SwiftProject/Project/View/Album/CCSpaceAlbumFliterPopView/CCSpaceAlbumFilterPopView2.swift b/SwiftProject/SwiftProject/Project/View/Album/CCSpaceAlbumFliterPopView/CCSpaceAlbumFilterPopView2.swift new file mode 100644 index 0000000..e71e989 --- /dev/null +++ b/SwiftProject/SwiftProject/Project/View/Album/CCSpaceAlbumFliterPopView/CCSpaceAlbumFilterPopView2.swift @@ -0,0 +1,445 @@ +// +// CCSpaceAlbumFilterPopView2.swift +// SwiftProject +// +// Created by aaa on 2024/3/22. +// + +import Foundation +import UIKit +import Photos + +private let Back_Height:CGFloat = KHZSize(700) + +class CCSpaceAlbumFilterPopView2: UIView { + var selectedImageHandler: ((Data,PHAsset) -> Void)? + var selectedVideoHandler: ((URL,PHAsset) -> Void)? + var selectedFileType:SelectedFileType = .all { + didSet{ + filterOffset = 0 + reloadData() + } + } + + var dataSource:[CCSpaceAlbumFliterModel] = [] + var filterOffset = 0//筛选内容的当前下标 + let filterLimit = 80//一次性获取的内容数量 + + + lazy var backView: UIView = { + let imageView = UIView(frame: CGRectMake(0, KScreenHeight + 10 , KScreenWidth, Back_Height)) + imageView.backgroundColor = UIColor(hexString: "#1F1E20") + imageView.addCorner(conrners: [.topLeft,.topRight], radius: 12.0) + return imageView + }() + + lazy var topView: UIView = { + let imageView = UIView(frame: CGRectMake(0, 0, backView.frame.size.width, 58)) + imageView.backgroundColor = .clear + return imageView + }() + + lazy var cancelButton: UIButton = { + let button = UIButton.init() + button.setTitle("取消", for: .normal) + button.setTitleColor(UIColor(red: 165.0/255, green: 137.0/255, blue: 1, alpha: 1), for: .normal) + button.titleLabel?.font = KFont_Medium(16) + button.titleLabel?.adjustsFontSizeToFitWidth = true + button.contentHorizontalAlignment = .center + button.addTarget(self, action: #selector(cancelAction), for: .touchUpInside) + + return button + }() + + + + + + let AlbumIdentifierCell: String = "CCSpaceAlbumFliterCollectionCell" + + lazy var listCollectView:UICollectionView = { + //1.流布局 + let collectionLayout = UICollectionViewFlowLayout() + //3.垂直和水平滚动 + collectionLayout.scrollDirection = .vertical + + //6.定义collectionView + let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: collectionLayout) + //7.注册collectionViewCell + collectionView.register(CCSpaceAlbumFliterCollectionCell.self, forCellWithReuseIdentifier: AlbumIdentifierCell) + + //10.设置代理 + collectionView.delegate = self + collectionView.dataSource = self + + //隐藏滑动条 + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + collectionView.backgroundColor = UIColor.black + return collectionView + }() + + lazy var segmentBtn:UISegmentedControl = { + let sbtn = UISegmentedControl.init(items: ["全部","图片","视频"]) + sbtn.addTarget(self, action: #selector(filterAction(btn:)), for: .valueChanged) + sbtn.setTitleTextAttributes([NSAttributedString.Key.foregroundColor:UIColor.white], for: .normal) + sbtn.setTitleTextAttributes([NSAttributedString.Key.foregroundColor:UIColor.black], for: .selected) + sbtn.selectedSegmentIndex = 0; + return sbtn + }() + + + + + //MARK: - 释放销毁 + deinit { + NotificationCenter.default.removeObserver(self) + } + + //MARK: - 通知 进入前台 + @objc func appEnterForeground(notification:Notification) { + + } + + + + + + //MARK: - UI action 视图 + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override init(frame: CGRect) { + super.init(frame: frame) + NotificationCenter.default.addObserver(self, selector: #selector(appEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil) + + self.backgroundColor = UIColor.black.withAlphaComponent(0.5) + + self.addSubview(backView) + + backView.addSubview(topView) + topView.addSubview(cancelButton) + topView.addSubview(segmentBtn) + backView.addSubview(listCollectView) + + + cancelButton.snp.makeConstraints { (make) in + make.leading.equalTo(topView.snp.leading).offset(16) + make.centerY.equalTo(topView.snp.centerY) + make.width.equalTo(32) + make.height.equalTo(24) + } + + + segmentBtn.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.centerX.equalToSuperview() + make.height.equalTo(40) + make.width.equalTo(200) + } + + + listCollectView.snp.makeConstraints { (make) in + make.top.equalTo(topView.snp.bottom) + make.leading.equalTo(backView.snp.leading) + make.trailing.equalTo(backView.snp.trailing) + make.bottom.equalTo(backView.snp.bottom) + + } + + reloadData() + } + + + @objc func cancelAction() { + hide() + } + + func hide() { + UIView.animate(withDuration: 0.5, animations: { [self] in + self.listCollectView.alpha = 0 + self.backView.frame = CGRect.init(x: 0, y: KScreenHeight + 10 , width: KScreenWidth, height: Back_Height) + }) { (isFinished) in + self.removeFromSuperview() + } + } + + func show() { + UIView.animate(withDuration: 0.5, animations: { + self.listCollectView.alpha = 1.0 + self.backView.frame = CGRect.init(x: 0, y: KScreenHeight - Back_Height, width: KScreenWidth, height: Back_Height) + }) { (isFinished) in + + self.listCollectView.reloadData() + } + } + + @objc func filterAction(btn:UISegmentedControl) { + print("xuan zhong ....\(btn.selectedSegmentIndex)") + self.selectedFileType = SelectedFileType(rawValue: btn.selectedSegmentIndex)! + } + + func listReloadData(){ + DispatchQueue.main.async { + self.listCollectView.reloadData() + } + } + + //MARK: - Data action 数据 + func reloadData(){ + print("重新装载数据。。。") + self.dataSource.removeAll() + loadMoreData(offset: filterOffset) + } + + func loadMoreData(offset:Int) { + let fetchResult_collection = PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.smartAlbum, subtype: PHAssetCollectionSubtype.any, options: nil); + //筛选空间相册 + var spatialAC:PHAssetCollection? + fetchResult_collection.enumerateObjects { ac, index, stop in + if ac.assetCollectionType == .smartAlbum , + ac.assetCollectionSubtype.rawValue == 1000000217{ + spatialAC = ac + stop.pointee = true + } + } + + //从相册中再次筛选资产类型 + if let sac = spatialAC { + let fetchOptions = PHFetchOptions() + //ascending 为YES时,按照照片的创建时间升序排列;为NO时,则降序排列 + fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] +// if self.selectedFileType != .all { +// let format = "mediaType=%d" +// let mt = PHAssetMediaType.init(rawValue: self.selectedFileType.rawValue)! +// fetchOptions.predicate = NSPredicate(format: format, +// argumentArray: [mt]) +// } + let fetchResult_asset = PHAsset.fetchAssets(in: sac, options: fetchOptions) + var count = 0 + switch self.selectedFileType { + case .all: + for i in offset ..< fetchResult_asset.count { + let asset = fetchResult_asset.object(at: i) + addImageFromAsset(asset: asset) + count += 1 + if count >= filterLimit { + break + } + } + break + case .image: + for i in offset ..< fetchResult_asset.count { + let asset = fetchResult_asset.object(at: i) + if asset.mediaType == .image { + addImageFromAsset(asset: asset) + count += 1 + if count >= filterLimit { + break + } + } + + } + break + case .video: + for i in offset ..< fetchResult_asset.count { + let asset = fetchResult_asset.object(at: i) + if asset.mediaType == .video { + addImageFromAsset(asset: asset) + count += 1 + if count >= filterLimit { + break + } + } + + } + break + } + + } + + self.listCollectView.reloadData() + } + + + func addImageFromAsset(asset:PHAsset){ + //处理模型 + let requestOptions = PHImageRequestOptions() + requestOptions.isSynchronous = false//设置成同步回调 + requestOptions.deliveryMode = .highQualityFormat + print("asset mediatype:\(asset.mediaType)") + PHImageManager.default().requestImageDataAndOrientation(for: asset, options: requestOptions) {[weak self] data, dataUTI, imagePropertyOrientation, info in + let photoImage:UIImage = UIImage(data: data!)! + //创建model + let model = CCSpaceAlbumFliterModel.initWithAssetType(assetType: AssetType.init(rawValue: asset.mediaType.rawValue-1)!, asset: asset,image:photoImage, localIdentifier: asset.localIdentifier) + self?.dataSource.append(model) + self?.listReloadData() + } + } +} + + + +//MARK: - extension 扩展 + +extension CCSpaceAlbumFilterPopView2:UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + + + // MARK: - 把秒数转换成时分秒(00:00:00)格式 + /// + /// - Parameter second: 秒数 + /// - Returns: String + func transToHourMinSec(second: Int) -> String { + let allTime: Int = second + var hours = 0 + var minutes = 0 + var seconds = 0 + var hoursText = "" + var minutesText = "" + var secondsText = "" + + hours = allTime / 3600 + hoursText = hours > 9 ? "\(hours)" : "0\(hours)" + + minutes = allTime % 3600 / 60 + minutesText = minutes > 9 ? "\(minutes)" : "0\(minutes)" + + seconds = allTime % 3600 % 60 + secondsText = seconds > 9 ? "\(seconds)" : "0\(seconds)" + + if hoursText == "00" { + return "\(minutesText):\(secondsText)" + }else{ + return "\(hoursText):\(minutesText):\(secondsText)" + } + + + } + + + // MARK: - UICollectionViewDataSource + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataSource.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: AlbumIdentifierCell, for: indexPath) as! CCSpaceAlbumFliterCollectionCell + + + let model:CCSpaceAlbumFliterModel = dataSource[indexPath.item] + + cell.imageView.image = model.image + + if model.assetType == .image { + + cell.frameCountLabel.text = "空间" + cell.frameCountLabel.isHidden = false + cell.timeLabel.isHidden = true + }else if model.assetType == .video { + + let time:Double = Double(model.itemAsset!.duration) +// let timeStr:String = ZZHHelper.formatVideoTime(second:Int(time)) + let timeStr:String = self.transToHourMinSec(second:Int(time)) + + cell.frameCountLabel.isHidden = true + cell.timeLabel.isHidden = false + cell.timeLabel.text = timeStr + } + + + return cell + } + + // MARK: - UICollectionViewDelegateFlowLayout + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let width = (collectionView.bounds.width - 4)/3 + return CGSize(width: width, height: width) + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { + return 2 + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { + return 2 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + + let model:CCSpaceAlbumFliterModel = self.dataSource[indexPath.item] + + guard let asset = model.itemAsset else { return } + //返回图片 + if asset.mediaType == .image { + //选择的是图片 + let imageData = getImageData(for: asset) + + // 关闭 + if Thread.isMainThread { + self.hide() + if let imageData = imageData { + self.selectedImageHandler?(imageData,asset) + } + }else{ + DispatchQueue.main.async { + self.hide() + if let imageData = imageData { + self.selectedImageHandler?(imageData,asset) + } + } + } + }else if asset.mediaType == .video { + //选择的是video + self.getVideoURL(from: asset) { url,avasset in + + if Thread.isMainThread { + self.hide() + self.selectedVideoHandler?(url,asset) + + }else{ + DispatchQueue.main.async { + self.hide() + self.selectedVideoHandler?(url,asset) + } + } + } + } + } + + //MARK: - 获取图片data + private func getImageData(for asset: PHAsset) -> Data? { + + var imageData: Data? + if asset.mediaType == .image { + + let requestOptions = PHImageRequestOptions() + requestOptions.isSynchronous = true//设置成同步回调 + requestOptions.deliveryMode = .highQualityFormat + PHImageManager.default().requestImageDataAndOrientation(for: asset, options: requestOptions) { data, dataUTI, imagePropertyOrientation, info in + imageData = data + } + } + + print(".....:\(imageData)") + return imageData + } + + private func getVideoURL(from asset: PHAsset, completion: @escaping (URL,AVURLAsset) -> Void) { + + if asset.mediaType == .video { + let requestOptions = PHVideoRequestOptions() + requestOptions.isNetworkAccessAllowed = true + //异步的 + PHImageManager.default().requestAVAsset(forVideo: asset, options: requestOptions) { (avAsset, _, _) in + if let avAsset = avAsset as? AVURLAsset { + let mediaURL = avAsset.url + completion(mediaURL,avAsset) + } + } + } else { + + } + } +} diff --git a/SwiftProject/SwiftProject/Project/View/Album/CCSpaceAlbumFliterPopView/CCSpaceAlbumFliterPopView.swift b/SwiftProject/SwiftProject/Project/View/Album/CCSpaceAlbumFliterPopView/CCSpaceAlbumFliterPopView.swift index 2a6764a..f4b8b38 100644 --- a/SwiftProject/SwiftProject/Project/View/Album/CCSpaceAlbumFliterPopView/CCSpaceAlbumFliterPopView.swift +++ b/SwiftProject/SwiftProject/Project/View/Album/CCSpaceAlbumFliterPopView/CCSpaceAlbumFliterPopView.swift @@ -28,7 +28,7 @@ enum SelectedFileType : Int { class CCSpaceAlbumFliterPopView: UIView { - var selectedFileType:SelectedFileType = .all + var selectedFileType:SelectedFileType = .image var allAssetItemModelArr:[CCSpaceAlbumFliterModel] = [] @@ -77,7 +77,6 @@ class CCSpaceAlbumFliterPopView: UIView { lazy var cancelButton: UIButton = { let button = UIButton.init() button.setTitle("取消", for: .normal) -// button.setTitleColor(KMain_Color, for: .normal) button.setTitleColor(UIColor(red: 165.0/255, green: 137.0/255, blue: 1, alpha: 1), for: .normal) button.titleLabel?.font = KFont_Medium(16) button.titleLabel?.adjustsFontSizeToFitWidth = true @@ -191,7 +190,7 @@ class CCSpaceAlbumFliterPopView: UIView { } fetchPhotos() - show() +// show() } //MARK: - 显示/隐藏 @@ -227,14 +226,19 @@ class CCSpaceAlbumFliterPopView: UIView { //ascending 为YES时,按照照片的创建时间升序排列;为NO时,则降序排列 fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] - + self.allAssetItemModelArr.removeAll() self.listCollectView.reloadData() if selectedFileType == .image { + print(".++++++") +// return let fetchImageResult = PHAsset.fetchAssets(with:.image, options: fetchOptions) + print("......") + fetchImageResult.enumerateObjects(options: .concurrent) { asset, index, stop in self.dealPhoto(asset: asset) } +// return self.listCollectView.reloadData() } else if selectedFileType == .video { @@ -354,6 +358,7 @@ class CCSpaceAlbumFliterPopView: UIView { //MARK: - 获取视频url private func getVideoURL(from asset: PHAsset, completion: @escaping (URL,AVURLAsset) -> Void) { + if asset.mediaType == .video { let requestOptions = PHVideoRequestOptions() requestOptions.isNetworkAccessAllowed = true @@ -376,19 +381,14 @@ class CCSpaceAlbumFliterPopView: UIView { if asset.mediaType == .image { let requestOptions = PHImageRequestOptions() - requestOptions.isSynchronous = true//设置成同步回调 + requestOptions.isSynchronous = false//设置成同步回调 requestOptions.deliveryMode = .highQualityFormat - - // PHImageManager.default().requestImageData(for: asset, options: requestOptions) { (data, _, _, _) in - // imageData = data - // } - PHImageManager.default().requestImageDataAndOrientation(for: asset, options: requestOptions) { data, dataUTI, imagePropertyOrientation, info in imageData = data } } - + print(".....:\(imageData)") return imageData }