harry 3 lat temu
rodzic
commit
cdee962c7a
31 zmienionych plików z 1125 dodań i 153 usunięć
  1. 1 0
      .gitignore
  2. 27 0
      BFRecordManager.swift
  3. 8 3
      BFRecordScreenKit.podspec
  4. 6 0
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/Contents.json
  5. 21 0
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/bottom_shadow.imageset/Contents.json
  6. BIN
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/bottom_shadow.imageset/shadow@3x.png
  7. 21 0
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/gou.imageset/Contents.json
  8. BIN
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/gou.imageset/gou@3x.png
  9. 21 0
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/mic1.imageset/Contents.json
  10. BIN
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/mic1.imageset/mic1@3x.png
  11. 21 0
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/mic2.imageset/Contents.json
  12. BIN
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/mic2.imageset/mic2@3x.png
  13. 21 0
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/xx.imageset/Contents.json
  14. BIN
      BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/xx.imageset/xx@3x.png
  15. 20 0
      BFRecordScreenKit/Classes/BFRSComm.swift
  16. 438 0
      BFRecordScreenKit/Classes/BFRecordScreenController.swift
  17. 0 0
      BFRecordScreenKit/Classes/ReplaceMe.swift
  18. 72 137
      Example/BFRecordScreenKit.xcodeproj/project.pbxproj
  19. 10 0
      Example/BFRecordScreenKit.xcworkspace/contents.xcworkspacedata
  20. 8 0
      Example/BFRecordScreenKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  21. 3 0
      Example/BFRecordScreenKit/AppDelegate.swift
  22. 85 5
      Example/BFRecordScreenKit/Base.lproj/Main.storyboard
  23. 6 0
      Example/BFRecordScreenKit/Images.xcassets/Contents.json
  24. 21 0
      Example/BFRecordScreenKit/Images.xcassets/add.imageset/Contents.json
  25. BIN
      Example/BFRecordScreenKit/Images.xcassets/add.imageset/add@3x.png
  26. 6 0
      Example/BFRecordScreenKit/Info.plist
  27. 67 0
      Example/BFRecordScreenKit/PhotoVideoListController.swift
  28. 9 0
      Example/BFRecordScreenKit/RecordScreenController.swift
  29. 26 1
      Example/BFRecordScreenKit/ViewController.swift
  30. 10 7
      Example/Podfile
  31. 197 0
      Example/Podfile.lock

+ 1 - 0
.gitignore

@@ -35,3 +35,4 @@ Carthage/Build
 # `pod install` in .travis.yml
 #
 # Pods/
+Example/Pods/*

+ 27 - 0
BFRecordManager.swift

@@ -0,0 +1,27 @@
+//
+//  BFRecordManager.swift
+//  BFRecordScreenKit
+//
+//  Created by 胡志强 on 2021/11/24.
+//
+
+import Foundation
+
+
+class BFRecordManager: NSObject {
+    
+    /// 录制音频
+    func startRecord(){
+        
+    }
+    
+    /// 取消音频录制
+    func cancleRecord(){
+        
+    }
+    
+    /// 结束音频录制
+    func endRecord(){
+        
+    }
+}

+ 8 - 3
BFRecordScreenKit.podspec

@@ -28,15 +28,20 @@ TODO: Add long description of the pod here.
   s.source           = { :git => 'https://github.com/harry/BFRecordScreenKit.git', :tag => s.version.to_s }
   # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
 
-  s.ios.deployment_target = '9.0'
+  s.ios.deployment_target = '10.0'
 
   s.source_files = 'BFRecordScreenKit/Classes/**/*'
-  
+  s.resource_bundles = {
+     'BFRecordScreenKit_Resources' => ['BFRecordScreenKit/Assets/*']
+   }
   # s.resource_bundles = {
   #   'BFRecordScreenKit' => ['BFRecordScreenKit/Assets/*.png']
   # }
 
   # s.public_header_files = 'Pod/Classes/**/*.h'
   # s.frameworks = 'UIKit', 'MapKit'
-  # s.dependency 'AFNetworking', '~> 2.3'
+  s.dependency 'BFCommonKit'
+  s.dependency 'BFUIKit'
+  s.dependency 'GPUImage'
+
 end

+ 6 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/bottom_shadow.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "shadow@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/bottom_shadow.imageset/shadow@3x.png


+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/gou.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "gou@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/gou.imageset/gou@3x.png


+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/mic1.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "mic1@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/mic1.imageset/mic1@3x.png


+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/mic2.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "mic2@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/mic2.imageset/mic2@3x.png


+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/xx.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "xx@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/xx.imageset/xx@3x.png


+ 20 - 0
BFRecordScreenKit/Classes/BFRSComm.swift

@@ -0,0 +1,20 @@
+//
+//  BFRSComm.swift
+//  BFRecordScreenKit
+//
+//  Created by 胡志强 on 2021/11/23.
+//
+
+import Foundation
+
+import BFCommonKit
+
+//class BFUIConfig{}
+
+public func imageInRecordScreenKit(by name: String) -> UIImage? {
+    return UIImage(named: name, in: currentBundle(), compatibleWith: nil)
+}
+
+func currentBundle() -> Bundle? {
+    return Bundle.current(moduleName: "BFRecordScreenKit", isAssets: true)
+}

+ 438 - 0
BFRecordScreenKit/Classes/BFRecordScreenController.swift

@@ -0,0 +1,438 @@
+//
+//  BFRecordScreenController.swift
+//  BFRecordScreenKit_Example
+//
+//  Created by 胡志强 on 2021/11/23.
+//  Copyright © 2021 CocoaPods. All rights reserved.
+//
+
+import Foundation
+import BFUIKit
+import GPUImage
+import Photos
+import BFCommonKit
+
+public class BFRecordScreenController: BFBaseViewController {
+    
+    public var asset:PHAsset?
+    
+    var audioPlayer:AVPlayer?       // 原视频音频播放
+    var movie :GPUImageMovie?       // 视频预览
+    var playView :GPUImageView?     // 视频展示视图
+    var isDragingProgressSlder : Bool = false
+    
+    // 录音相关
+    var record:AVAudioRecorder?
+    var beginOnStartBtn:Bool = false
+    var touchStart:CGPoint = CGPoint(x: 0, y: 0)
+    var avplayerTimeObserver: NSKeyValueObservation?
+
+    lazy var playBtn:UIButton = {
+        let btn = UIButton(frame: view.bounds)
+        btn.addTarget(self, action: #selector(playVideo(btn:)), for: .touchUpInside)
+        return btn
+    }()
+    
+    lazy var bottomeView:UIImageView = {
+        let iv = UIImageView(image: imageInRecordScreenKit(by: "bottom_shadow"))
+        iv.contentMode = .scaleAspectFill
+        iv.isUserInteractionEnabled = true
+        // 拖曳手勢
+        let pan = UIPanGestureRecognizer(target: self, action: #selector(pan(recognizer:)))
+        pan.delegate = self
+        pan.minimumNumberOfTouches = 1
+        pan.maximumNumberOfTouches = 1
+        iv.addGestureRecognizer(pan)
+        
+        return iv
+    }()
+    
+    lazy var recordBtn:UIButton = {
+        let btn = UIButton(type: .custom)
+        btn.setImage(imageInRecordScreenKit(by: "mic1"), for: .normal)
+        btn.adjustsImageWhenHighlighted = false
+        btn.addTarget(self, action: #selector(startRecord(btn:)), for: .touchDown)
+        btn.addTarget(self, action: #selector(endRecord(btn:)), for: .touchUpInside)
+        return btn
+    }()
+    
+    lazy var progessSilde:BFPlayerSlider = {
+        let sliderView = BFPlayerSlider()
+        let thbImage = UIImage(named: "icon_point")
+        sliderView.setMinimumTrackImage(thbImage, for: .normal)
+        sliderView.setMaximumTrackImage(thbImage, for: .normal)
+        sliderView.setThumbImage(thbImage, for: .highlighted)
+        sliderView.setThumbImage(thbImage, for: .normal)
+        sliderView.maximumTrackTintColor = UIColor.hexColor(hexadecimal: "#303030")
+        sliderView.minimumTrackTintColor = UIColor.hexColor(hexadecimal: "#FA6400")
+        sliderView.addTarget(self, action: #selector(sliderTouchBegan(sender:)), for: .touchDown)
+        sliderView.addTarget(self, action: #selector(sliderTouchEnded(sender:)), for: .touchUpInside)
+        sliderView.addTarget(self, action: #selector(sliderTouchEnded(sender:)), for: .touchUpOutside)
+        sliderView.addTarget(self, action: #selector(sliderTouchEnded(sender:)), for: .touchCancel)
+        return sliderView
+    }()
+    
+    lazy var closeBtn:UIButton = {
+        let btn = UIButton(type: .custom)
+        btn.setImage(imageInRecordScreenKit(by: "xx"), for: .normal)
+        btn.contentHorizontalAlignment = .right
+        btn.addTarget(self, action: #selector(backBtnClick), for: .touchUpInside)
+        return btn
+    }()
+    
+    lazy var nextBtn:UIButton = {
+        let btn = UIButton(type: .custom)
+        btn.setImage(imageInRecordScreenKit(by: "gou"), for: .normal)
+        btn.contentHorizontalAlignment = .left
+        btn.addTarget(self, action: #selector(nextAction), for: .touchUpInside)
+        return btn
+    }()
+    
+    //MARK: -- 生命周期
+    deinit {
+        cleanMovieTarget()
+        NotificationCenter.default.removeObserver(self)
+        avplayerTimeObserver?.invalidate()
+
+    }
+    
+    public override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        self.navigationController?.isNavigationBarHidden = true
+        hiddenNavigation()
+    }
+    
+    public  override func viewDidLoad(){
+        super.viewDidLoad()
+        _ = disablePopGesture()
+        
+        view.backgroundColor = .lightGray
+        
+        playView = GPUImageView(frame: view.bounds)
+        view.addSubview(playView!)
+        fetchVideo()
+        
+        
+        view.addSubview(playBtn)
+        view.addSubview(bottomeView)
+        bottomeView.addSubview(recordBtn)
+        bottomeView.addSubview(progessSilde)
+        bottomeView.addSubview(closeBtn)
+        bottomeView.addSubview(nextBtn)
+        
+        _ = checkStatus()
+    }
+    
+    public override func viewWillLayoutSubviews() {
+        super.viewWillLayoutSubviews()
+        bottomeView.snp.makeConstraints { make in
+            make.left.bottom.right.equalToSuperview()
+            make.height.equalTo(adapterWidth(width: 220))
+        }
+        
+        recordBtn.snp.makeConstraints { make in
+            make.width.height.equalTo(120)
+            make.centerX.equalToSuperview()
+            make.top.equalTo(27)
+        }
+        
+        closeBtn.snp.makeConstraints { make in
+            make.left.equalToSuperview()
+            make.width.height.equalTo(60)
+            make.top.equalTo(recordBtn.snp.bottom).offset(-10)
+        }
+        nextBtn.snp.makeConstraints { make in
+            make.right.equalToSuperview()
+            make.top.width.height.equalTo(closeBtn)
+        }
+        
+        progessSilde.snp.makeConstraints { make in
+            make.left.equalTo(closeBtn.snp.right).offset(6)
+            make.right.equalTo(nextBtn.snp.left).offset(-6)
+            make.centerY.equalTo(closeBtn)
+            make.height.equalTo(20)
+        }
+        
+    }
+    
+    // MARK: - 按钮事件响应
+    
+    // 觸發拖曳手勢後 執行的動作
+    @objc func pan(recognizer: UIPanGestureRecognizer) {
+        // 設置 UIView 新的位置
+        if !checkStatus(show: false) {
+            return
+        }
+
+        let point = recognizer.location(in: bottomeView)
+
+        switch recognizer.state {
+        case .began:
+            touchStart = recognizer.location(in: bottomeView)
+            beginOnStartBtn = recordBtn.frame.contains(touchStart)
+        case .changed:
+            if beginOnStartBtn == true {
+                let nowPoint = recognizer.location(in: bottomeView)
+                BFLog(1, message: "nowPoint x: \(nowPoint.x) y:\(nowPoint.y)")
+                if recordBtn.frame.contains(nowPoint) {
+                    
+                } else {
+                    
+                }
+            }
+
+        case .ended:
+            BFLog(1, message: "移动结束 \(beginOnStartBtn)")
+            if beginOnStartBtn == true {
+                beginOnStartBtn = false
+                if recordBtn.frame.contains(point) {
+                    // 结束录制
+                    endRecord(btn: recordBtn)
+                } else {
+                    cancleRecord()
+                }
+            }
+
+        default:
+            break
+        }
+    }
+    
+    @objc func startRecord(btn:UIButton){
+        btn.setImage(imageInRecordScreenKit(by: "mic2"), for: .normal)
+        BFLog(1, message: "start \(UIControl.Event.touchDown)")
+    }
+    
+    @objc func endRecord(btn:UIButton){
+        cancleRecord()
+        // 存储录音
+    }
+    
+    func cancleRecord(){
+        recordBtn.setImage(imageInRecordScreenKit(by: "mic1"), for: .normal)
+        BFLog(1, message: "cancel ")
+    }
+    @objc func close(){
+        pause()
+        backBtnClick()
+    }
+    
+    @objc func nextAction(){
+        pause()
+    }
+    
+    @objc func playVideo(btn:UIButton){
+        btn.isSelected = !btn.isSelected
+        BFLog(1, message: "点击")
+        if btn.isSelected{
+            play()
+
+        }else{
+            pause()
+        }
+    }
+
+    @objc public func sliderTouchBegan(sender _: UISlider) {
+        isDragingProgressSlder = true
+        pause()
+    }
+
+    @objc public func sliderTouchEnded(sender: UISlider) {
+        changeProgress(progress: sender.value)
+        isDragingProgressSlder = false
+        play()
+    }
+    
+    // MARK: - 权限申请
+    func checkStatus(show: Bool = true) -> Bool {
+        let status = AVCaptureDevice.authorizationStatus(for: .audio)
+        switch status {
+        case .denied, .restricted:
+
+            BFLog(message: "麦克风权限被拒绝,请在设置中打开")
+            if show {
+                let remindData = BFBaseModel()
+                remindData.title = "票圈视频需要访问你的麦克风才能录音"
+                remindData.summary = ""
+                let remindView = BFRemindView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
+                remindView.isBanned = true
+                remindView.confirmBtn.setTitle("去设置", for: .normal)
+                UIApplication.shared.keyWindow?.addSubview(remindView)
+                remindView.remindData = remindData
+                remindView.remindBlock = { [weak self] item, _ in
+                    if item.tag == 2 {
+                        openAppSetting()
+                    }
+                }
+            }
+            return false
+        case .authorized:
+            return true
+        case .notDetermined:
+            if show {
+                requestMicroPhoneAuth()
+            }
+            return false
+        default:
+            break
+        }
+
+        return false
+    }
+    
+    func requestMicroPhoneAuth() {
+        AVCaptureDevice.requestAccess(for: .audio) { granted in
+            if !granted {
+                BFLog(message: "麦克风权限被拒绝,请在设置中打开")
+            }
+        }
+    }
+    
+    // MARK: - 音视频处理
+    
+    func play(){
+        cShowHUB(superView: nil, msg: "开始播放")
+        movie?.startProcessing()
+        audioPlayer?.play()
+    }
+    
+    func pause(){
+        cShowHUB(superView: nil, msg: "暂停播放")
+        movie?.cancelProcessing()
+        audioPlayer?.pause()
+    }
+    
+    func fetchVideo(){
+        if let asset = self.asset {
+            let options = PHVideoRequestOptions()
+            options.isNetworkAccessAllowed = true
+            options.deliveryMode = .automatic
+            
+            PHImageManager.default().requestPlayerItem(forVideo:asset, options: options, resultHandler: { [weak self] playerItem, info in
+
+                guard let item = playerItem else {
+                    cShowHUB(superView: nil, msg: "视频获取失败")
+                    return
+                }
+                self?.setAudioPlay(item: item)
+                self?.setVideoPlay(item: item)
+                
+            })
+            
+            let option = PHImageRequestOptions()
+            option.isNetworkAccessAllowed = true //允许下载iCloud的图片
+            option.resizeMode = .fast
+            option.deliveryMode = .highQualityFormat
+            PHImageManager.default().requestImage(for: asset, targetSize: self.view.bounds.size,
+                                                          contentMode: .aspectFit,
+                                                          options: option)
+                    { (image, nil) in
+                         //image就是图片
+                        if image != nil {
+                            let pic = GPUImagePicture(image: image)
+                            let filet = GPUImageFilter()
+                            pic?.addTarget(filet)
+                            filet.addTarget(self.playView)
+                            pic?.processImage()
+                        }
+                        
+                    }
+            
+//          使用copy资源到本地的方式
+//            let outFilePath = NSHomeDirectory().appending("/Documents/simple.mp4")
+//            let outFileUrl = URL(fileURLWithPath: outFilePath)
+//            if FileManager.default.fileExists(atPath: outFilePath) {
+//                try? FileManager.default.removeItem(atPath: outFilePath)
+//            }
+//
+//            let assetResources = PHAssetResource.assetResources(for: asset)
+            
+//            if let rsc = assetResources.first(where: { res in
+//                res.type == .video  || res.type == .pairedVideo
+//            }) {
+//                PHAssetResourceManager.default().writeData(for: rsc, toFile:outFileUrl, options: nil) {[weak self] error in
+//                    if error == nil {
+//                        DispatchQueue.main.async {[weak self] in
+//                            self?.setVideoPlay(url: outFileUrl)
+//                            self?.setAudioPlay(url: outFileUrl)
+//                        }
+//                    }else{
+//                        BFLog(1, message: "导出视频相exportAsynchro faile")
+//                    }
+//                }
+//            }else{
+//
+//            }
+
+        }
+
+    }
+    
+    func setVideoPlay(item:AVPlayerItem){
+        if movie != nil {
+            cleanMovieTarget()
+        }
+        movie = GPUImageMovie(playerItem: item)
+//        movie?.runBenchmark = true
+        movie?.playAtActualSpeed = true
+
+        let filter = GPUImageFilter()
+        movie?.addTarget(filter)
+        filter.addTarget(playView)
+    }
+    
+    func setAudioPlay(item:AVPlayerItem){
+
+        if let playItem = audioPlayer?.currentItem {
+            NotificationCenter.default.removeObserver(self, name: .AVPlayerItemDidPlayToEndTime, object: playItem)
+            audioPlayer?.replaceCurrentItem(with: item)
+        }else {
+            audioPlayer = AVPlayer(playerItem: item)
+            avplayerTimeObserver = audioPlayer?.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 10), queue: DispatchQueue.global()) {[weak self] time in
+             //    进度监控
+                BFLog(1, message: "curr:\(CMTimeGetSeconds(time))")
+                if CMTimeGetSeconds(item.duration) > 0, !(self?.isDragingProgressSlder ?? false) {
+                    DispatchQueue.main.async { [weak self] in
+                        self?.progessSilde.value = Float(CMTimeGetSeconds(time) / CMTimeGetSeconds(item.duration))
+                    }
+                }
+            } as? NSKeyValueObservation
+        }
+
+        
+        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: audioPlayer?.currentItem, queue: .main) { [weak self] notify in
+            BFLog(message: "AVPlayerItemDidPlayToEndTime = \(notify)")
+            self?.audioPlayer?.seek(to: kCMTimeZero)
+            self?.playBtn.isSelected = false
+        }
+    }
+
+    
+    func cleanMovieTarget(){
+        movie?.cancelProcessing()
+        movie?.targets().forEach({ target in
+            if let objc = target as? GPUImageOutput{
+                objc.removeAllTargets()
+            }
+        })
+        movie?.removeAllTargets()
+    }
+    
+    func changeProgress(progress:Float) {
+        if let item = audioPlayer?.currentItem {
+            let duration = CMTimeGetSeconds(item.duration)
+            item.seek(to: CMTime(value: CMTimeValue(progress * Float(duration) * 100), timescale: 100)) { finished in
+                if finished{
+                    BFLog(1, message: "拖动成功")
+                }
+            }
+        }
+    }
+}
+
+extension BFRecordScreenController:GPUImageMovieDelegate {
+    public func didCompletePlayingMovie(){
+        BFLog(1, message: "播放结束")
+        
+    }
+}

+ 0 - 0
BFRecordScreenKit/Classes/ReplaceMe.swift


+ 72 - 137
Example/BFRecordScreenKit.xcodeproj/project.pbxproj

@@ -7,31 +7,23 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		4A96F094274CF8DC008657DA /* PhotoVideoListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A96F093274CF8DC008657DA /* PhotoVideoListController.swift */; };
+		4A96F09C274DDD26008657DA /* blg.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 4A96F09B274DDD26008657DA /* blg.mp4 */; };
 		607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; };
 		607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; };
 		607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; };
 		607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; };
 		607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; };
-		607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; };
-		6FDEC2E2C32E6520022F3B4D /* Pods_BFRecordScreenKit_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2C1224C6B57451A42D7B9C4 /* Pods_BFRecordScreenKit_Tests.framework */; };
 		A957E4BFDFB28FDCCC410049 /* Pods_BFRecordScreenKit_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E394037E3C86B6D51A62719 /* Pods_BFRecordScreenKit_Example.framework */; };
 /* End PBXBuildFile section */
 
-/* Begin PBXContainerItemProxy section */
-		607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 607FACC81AFB9204008FA782 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 607FACCF1AFB9204008FA782;
-			remoteInfo = BFRecordScreenKit;
-		};
-/* End PBXContainerItemProxy section */
-
 /* Begin PBXFileReference section */
 		11A243ECC5F039CC0D6417E0 /* Pods-BFRecordScreenKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BFRecordScreenKit_Example.release.xcconfig"; path = "Target Support Files/Pods-BFRecordScreenKit_Example/Pods-BFRecordScreenKit_Example.release.xcconfig"; sourceTree = "<group>"; };
 		142F0A79F3F81D559C975EA3 /* Pods-BFRecordScreenKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BFRecordScreenKit_Tests.debug.xcconfig"; path = "Target Support Files/Pods-BFRecordScreenKit_Tests/Pods-BFRecordScreenKit_Tests.debug.xcconfig"; sourceTree = "<group>"; };
 		1CDC9754F414D402A7A92B91 /* Pods-BFRecordScreenKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BFRecordScreenKit_Example.debug.xcconfig"; path = "Target Support Files/Pods-BFRecordScreenKit_Example/Pods-BFRecordScreenKit_Example.debug.xcconfig"; sourceTree = "<group>"; };
-		27B6EE71C97A2E92661B8CA2 /* BFRecordScreenKit.podspec */ = {isa = PBXFileReference; includeInIndex = 1; name = BFRecordScreenKit.podspec; path = ../BFRecordScreenKit.podspec; sourceTree = "<group>"; };
+		27B6EE71C97A2E92661B8CA2 /* BFRecordScreenKit.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = BFRecordScreenKit.podspec; path = ../BFRecordScreenKit.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
+		4A96F093274CF8DC008657DA /* PhotoVideoListController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoVideoListController.swift; sourceTree = "<group>"; };
+		4A96F09B274DDD26008657DA /* blg.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = blg.mp4; sourceTree = "<group>"; };
 		5E394037E3C86B6D51A62719 /* Pods_BFRecordScreenKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BFRecordScreenKit_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		607FACD01AFB9204008FA782 /* BFRecordScreenKit_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BFRecordScreenKit_Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -40,12 +32,11 @@
 		607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
 		607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
-		607FACE51AFB9204008FA782 /* BFRecordScreenKit_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BFRecordScreenKit_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = "<group>"; };
 		829548346A7A35F42174B065 /* Pods-BFRecordScreenKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BFRecordScreenKit_Tests.release.xcconfig"; path = "Target Support Files/Pods-BFRecordScreenKit_Tests/Pods-BFRecordScreenKit_Tests.release.xcconfig"; sourceTree = "<group>"; };
-		B4164F7238521FC6C4619D45 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
-		C1A660AF3EC4C5C9B5320AC1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; name = README.md; path = ../README.md; sourceTree = "<group>"; };
+		B4164F7238521FC6C4619D45 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
+		C1A660AF3EC4C5C9B5320AC1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
 		F2C1224C6B57451A42D7B9C4 /* Pods_BFRecordScreenKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BFRecordScreenKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -58,14 +49,6 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		607FACE21AFB9204008FA782 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				6FDEC2E2C32E6520022F3B4D /* Pods_BFRecordScreenKit_Tests.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
@@ -94,7 +77,6 @@
 			isa = PBXGroup;
 			children = (
 				607FACD01AFB9204008FA782 /* BFRecordScreenKit_Example.app */,
-				607FACE51AFB9204008FA782 /* BFRecordScreenKit_Tests.xctest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -104,6 +86,8 @@
 			children = (
 				607FACD51AFB9204008FA782 /* AppDelegate.swift */,
 				607FACD71AFB9204008FA782 /* ViewController.swift */,
+				4A96F093274CF8DC008657DA /* PhotoVideoListController.swift */,
+				4A96F09B274DDD26008657DA /* blg.mp4 */,
 				607FACD91AFB9204008FA782 /* Main.storyboard */,
 				607FACDC1AFB9204008FA782 /* Images.xcassets */,
 				607FACDE1AFB9204008FA782 /* LaunchScreen.xib */,
@@ -156,7 +140,6 @@
 				142F0A79F3F81D559C975EA3 /* Pods-BFRecordScreenKit_Tests.debug.xcconfig */,
 				829548346A7A35F42174B065 /* Pods-BFRecordScreenKit_Tests.release.xcconfig */,
 			);
-			name = Pods;
 			path = Pods;
 			sourceTree = "<group>";
 		};
@@ -172,6 +155,7 @@
 				607FACCD1AFB9204008FA782 /* Frameworks */,
 				607FACCE1AFB9204008FA782 /* Resources */,
 				B183A636D7A54C4278A56803 /* [CP] Embed Pods Frameworks */,
+				DCD300EF81080DC6E87BE9AA /* [CP] Copy Pods Resources */,
 			);
 			buildRules = (
 			);
@@ -182,25 +166,6 @@
 			productReference = 607FACD01AFB9204008FA782 /* BFRecordScreenKit_Example.app */;
 			productType = "com.apple.product-type.application";
 		};
-		607FACE41AFB9204008FA782 /* BFRecordScreenKit_Tests */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "BFRecordScreenKit_Tests" */;
-			buildPhases = (
-				B927C0D3B7D214349B56D814 /* [CP] Check Pods Manifest.lock */,
-				607FACE11AFB9204008FA782 /* Sources */,
-				607FACE21AFB9204008FA782 /* Frameworks */,
-				607FACE31AFB9204008FA782 /* Resources */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				607FACE71AFB9204008FA782 /* PBXTargetDependency */,
-			);
-			name = BFRecordScreenKit_Tests;
-			productName = Tests;
-			productReference = 607FACE51AFB9204008FA782 /* BFRecordScreenKit_Tests.xctest */;
-			productType = "com.apple.product-type.bundle.unit-test";
-		};
 /* End PBXNativeTarget section */
 
 /* Begin PBXProject section */
@@ -213,13 +178,9 @@
 				TargetAttributes = {
 					607FACCF1AFB9204008FA782 = {
 						CreatedOnToolsVersion = 6.3.1;
+						DevelopmentTeam = UH52C8A7SN;
 						LastSwiftMigration = 0900;
 					};
-					607FACE41AFB9204008FA782 = {
-						CreatedOnToolsVersion = 6.3.1;
-						LastSwiftMigration = 0900;
-						TestTargetID = 607FACCF1AFB9204008FA782;
-					};
 				};
 			};
 			buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "BFRecordScreenKit" */;
@@ -227,6 +188,7 @@
 			developmentRegion = English;
 			hasScannedForEncodings = 0;
 			knownRegions = (
+				English,
 				en,
 				Base,
 			);
@@ -236,7 +198,6 @@
 			projectRoot = "";
 			targets = (
 				607FACCF1AFB9204008FA782 /* BFRecordScreenKit_Example */,
-				607FACE41AFB9204008FA782 /* BFRecordScreenKit_Tests */,
 			);
 		};
 /* End PBXProject section */
@@ -249,13 +210,7 @@
 				607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */,
 				607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */,
 				607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		607FACE31AFB9204008FA782 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+				4A96F09C274DDD26008657DA /* blg.mp4 in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -291,37 +246,75 @@
 			);
 			inputPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-BFRecordScreenKit_Example/Pods-BFRecordScreenKit_Example-frameworks.sh",
+				"${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework",
+				"${BUILT_PRODUCTS_DIR}/AliyunOSSiOS/AliyunOSSiOS.framework",
+				"${BUILT_PRODUCTS_DIR}/BFCommonKit/BFCommonKit.framework",
+				"${BUILT_PRODUCTS_DIR}/BFNetRequestKit/BFNetRequestKit.framework",
 				"${BUILT_PRODUCTS_DIR}/BFRecordScreenKit/BFRecordScreenKit.framework",
+				"${BUILT_PRODUCTS_DIR}/BFUIKit/BFUIKit.framework",
+				"${BUILT_PRODUCTS_DIR}/FDFullscreenPopGesture/FDFullscreenPopGesture.framework",
+				"${BUILT_PRODUCTS_DIR}/GPUImage/GPUImage.framework",
+				"${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework",
+				"${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework",
+				"${BUILT_PRODUCTS_DIR}/KingfisherWebP/KingfisherWebP.framework",
+				"${BUILT_PRODUCTS_DIR}/LMJHorizontalScrollText/LMJHorizontalScrollText.framework",
+				"${BUILT_PRODUCTS_DIR}/MGSwipeTableCell/MGSwipeTableCell.framework",
+				"${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework",
+				"${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework",
+				"${BUILT_PRODUCTS_DIR}/Realm/Realm.framework",
+				"${BUILT_PRODUCTS_DIR}/RealmSwift/RealmSwift.framework",
+				"${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework",
+				"${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework",
+				"${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework",
+				"${BUILT_PRODUCTS_DIR}/libwebp/libwebp.framework",
 			);
 			name = "[CP] Embed Pods Frameworks";
 			outputPaths = (
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AliyunOSSiOS.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BFCommonKit.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BFNetRequestKit.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BFRecordScreenKit.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BFUIKit.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FDFullscreenPopGesture.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GPUImage.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KeychainAccess.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KingfisherWebP.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LMJHorizontalScrollText.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MGSwipeTableCell.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectMapper.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RealmSwift.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast_Swift.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libwebp.framework",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BFRecordScreenKit_Example/Pods-BFRecordScreenKit_Example-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		B927C0D3B7D214349B56D814 /* [CP] Check Pods Manifest.lock */ = {
+		DCD300EF81080DC6E87BE9AA /* [CP] Copy Pods Resources */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
-			inputFileListPaths = (
-			);
 			inputPaths = (
-				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
-				"${PODS_ROOT}/Manifest.lock",
-			);
-			name = "[CP] Check Pods Manifest.lock";
-			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-BFRecordScreenKit_Example/Pods-BFRecordScreenKit_Example-resources.sh",
+				"${PODS_CONFIGURATION_BUILD_DIR}/BFFramework/BFFramework_Resources.bundle",
+				"${PODS_CONFIGURATION_BUILD_DIR}/BFMaterialKit/BFMaterialKit_Resources.bundle",
 			);
+			name = "[CP] Copy Pods Resources";
 			outputPaths = (
-				"$(DERIVED_FILE_DIR)/Pods-BFRecordScreenKit_Tests-checkManifestLockResult.txt",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/BFFramework_Resources.bundle",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/BFMaterialKit_Resources.bundle",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BFRecordScreenKit_Example/Pods-BFRecordScreenKit_Example-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
 /* End PBXShellScriptBuildPhase section */
@@ -331,29 +324,14 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4A96F094274CF8DC008657DA /* PhotoVideoListController.swift in Sources */,
 				607FACD81AFB9204008FA782 /* ViewController.swift in Sources */,
 				607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		607FACE11AFB9204008FA782 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				607FACEC1AFB9204008FA782 /* Tests.swift in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 /* End PBXSourcesBuildPhase section */
 
-/* Begin PBXTargetDependency section */
-		607FACE71AFB9204008FA782 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 607FACCF1AFB9204008FA782 /* BFRecordScreenKit_Example */;
-			targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */;
-		};
-/* End PBXTargetDependency section */
-
 /* Begin PBXVariantGroup section */
 		607FACD91AFB9204008FA782 /* Main.storyboard */ = {
 			isa = PBXVariantGroup;
@@ -419,7 +397,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = iphoneos;
@@ -465,7 +443,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				SDKROOT = iphoneos;
 				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -478,10 +456,13 @@
 			baseConfigurationReference = 1CDC9754F414D402A7A92B91 /* Pods-BFRecordScreenKit_Example.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				DEVELOPMENT_TEAM = UH52C8A7SN;
+				ENABLE_BITCODE = NO;
 				INFOPLIST_FILE = BFRecordScreenKit/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				MODULE_NAME = ExampleApp;
-				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.tzld.BFRecordScreenKit-Example";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_SWIFT3_OBJC_INFERENCE = Default;
 				SWIFT_VERSION = 4.0;
@@ -493,56 +474,19 @@
 			baseConfigurationReference = 11A243ECC5F039CC0D6417E0 /* Pods-BFRecordScreenKit_Example.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				DEVELOPMENT_TEAM = UH52C8A7SN;
+				ENABLE_BITCODE = NO;
 				INFOPLIST_FILE = BFRecordScreenKit/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				MODULE_NAME = ExampleApp;
-				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.tzld.BFRecordScreenKit-Example";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_SWIFT3_OBJC_INFERENCE = Default;
 				SWIFT_VERSION = 4.0;
 			};
 			name = Release;
 		};
-		607FACF31AFB9204008FA782 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 142F0A79F3F81D559C975EA3 /* Pods-BFRecordScreenKit_Tests.debug.xcconfig */;
-			buildSettings = {
-				FRAMEWORK_SEARCH_PATHS = (
-					"$(PLATFORM_DIR)/Developer/Library/Frameworks",
-					"$(inherited)",
-				);
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"DEBUG=1",
-					"$(inherited)",
-				);
-				INFOPLIST_FILE = Tests/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
-				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				SWIFT_SWIFT3_OBJC_INFERENCE = Default;
-				SWIFT_VERSION = 4.0;
-				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BFRecordScreenKit_Example.app/BFRecordScreenKit_Example";
-			};
-			name = Debug;
-		};
-		607FACF41AFB9204008FA782 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 829548346A7A35F42174B065 /* Pods-BFRecordScreenKit_Tests.release.xcconfig */;
-			buildSettings = {
-				FRAMEWORK_SEARCH_PATHS = (
-					"$(PLATFORM_DIR)/Developer/Library/Frameworks",
-					"$(inherited)",
-				);
-				INFOPLIST_FILE = Tests/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
-				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				SWIFT_SWIFT3_OBJC_INFERENCE = Default;
-				SWIFT_VERSION = 4.0;
-				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BFRecordScreenKit_Example.app/BFRecordScreenKit_Example";
-			};
-			name = Release;
-		};
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
@@ -564,15 +508,6 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "BFRecordScreenKit_Tests" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				607FACF31AFB9204008FA782 /* Debug */,
-				607FACF41AFB9204008FA782 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
 /* End XCConfigurationList section */
 	};
 	rootObject = 607FACC81AFB9204008FA782 /* Project object */;

+ 10 - 0
Example/BFRecordScreenKit.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:BFRecordScreenKit.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>

+ 8 - 0
Example/BFRecordScreenKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 3 - 0
Example/BFRecordScreenKit/AppDelegate.swift

@@ -16,6 +16,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
 
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
         // Override point for customization after application launch.
+        if let tbc = self.window?.rootViewController as? UITabBarController {
+            tbc.selectedIndex = 1
+        }
         return true
     }
 

+ 85 - 5
Example/BFRecordScreenKit/Base.lproj/Main.storyboard

@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="vXZ-lx-hvc">
-    <device id="retina4_7" orientation="portrait">
-        <adaptation id="fullscreen"/>
-    </device>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19455" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="fEj-nr-pet">
+    <device id="retina4_7" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19454"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <scenes>
@@ -22,9 +21,90 @@
                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     </view>
+                    <navigationItem key="navigationItem" id="CvA-EO-ANW"/>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
             </objects>
+            <point key="canvasLocation" x="-518" y="-581"/>
+        </scene>
+        <!--云空间-->
+        <scene sceneID="hGD-UV-HYL">
+            <objects>
+                <viewController id="L2Z-Lc-n3c" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="O2n-7d-L5A"/>
+                        <viewControllerLayoutGuide type="bottom" id="Iay-0I-rmS"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="Kb1-JA-xzD">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="云空间" id="2DC-kS-hEG"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="NU0-r9-L60" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-1263" y="297"/>
+        </scene>
+        <!--消息-->
+        <scene sceneID="PUi-4r-kgT">
+            <objects>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="hqS-OJ-hr3" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+                <viewController id="o84-zO-yVc" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="7KF-DE-R2a"/>
+                        <viewControllerLayoutGuide type="bottom" id="b91-9a-1MN"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="wlR-ib-dJG">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="消息" id="9kT-Qq-aUx"/>
+                </viewController>
+            </objects>
+            <point key="canvasLocation" x="-1262" y="-1408"/>
+        </scene>
+        <!--Tab Bar Controller-->
+        <scene sceneID="0y6-eq-I7b">
+            <objects>
+                <tabBarController id="fEj-nr-pet" sceneMemberID="viewController">
+                    <tabBar key="tabBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="zSx-2F-fxU">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="49"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    </tabBar>
+                    <connections>
+                        <segue destination="o84-zO-yVc" kind="relationship" relationship="viewControllers" id="fXR-g0-YhH"/>
+                        <segue destination="Ls9-6c-xu9" kind="relationship" relationship="viewControllers" id="6Oo-H4-hGA"/>
+                        <segue destination="L2Z-Lc-n3c" kind="relationship" relationship="viewControllers" id="5gn-HB-DUs"/>
+                    </connections>
+                </tabBarController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="6Zg-zJ-XfQ" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-2205" y="-579"/>
+        </scene>
+        <!--开讲-->
+        <scene sceneID="x2i-DG-Rkn">
+            <objects>
+                <navigationController id="Ls9-6c-xu9" sceneMemberID="viewController">
+                    <tabBarItem key="tabBarItem" title="开讲" id="PHa-lJ-7QQ"/>
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="I4J-OK-Lwb">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <connections>
+                        <segue destination="vXZ-lx-hvc" kind="relationship" relationship="rootViewController" id="01a-Np-7KF"/>
+                    </connections>
+                </navigationController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="VHh-li-mhR" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-1263" y="-580"/>
         </scene>
     </scenes>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
 </document>

+ 6 - 0
Example/BFRecordScreenKit/Images.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 21 - 0
Example/BFRecordScreenKit/Images.xcassets/add.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "add@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
Example/BFRecordScreenKit/Images.xcassets/add.imageset/add@3x.png


+ 6 - 0
Example/BFRecordScreenKit/Info.plist

@@ -22,6 +22,12 @@
 	<string>1</string>
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
+	<key>NSMicrophoneUsageDescription</key>
+	<string>请点击"允许"以允许访问,以便于使用视频制作功能</string>
+	<key>NSPhotoLibraryAddUsageDescription</key>
+	<string>请点击"允许"以允许访问,以便于视频保存</string>
+	<key>NSPhotoLibraryUsageDescription</key>
+	<string>请点击"允许"以允许访问,以便于选择视频</string>
 	<key>UILaunchStoryboardName</key>
 	<string>LaunchScreen</string>
 	<key>UIMainStoryboardFile</key>

+ 67 - 0
Example/BFRecordScreenKit/PhotoVideoListController.swift

@@ -0,0 +1,67 @@
+//
+//  PhotoVideoListController.swift
+//  BFRecordScreenKit_Example
+//
+//  Created by 胡志强 on 2021/11/23.
+//  Copyright © 2021 CocoaPods. All rights reserved.
+//
+
+import Foundation
+import BFUIKit
+import BFMaterialKit
+import UIKit
+import BFRecordScreenKit
+import Photos
+
+
+class PhotoVideoListController: BFBaseViewController {
+    
+    var chosedAsset:PHAsset?
+    
+    lazy var photoMaterialVc: BFPhotosMaterialController = {
+        let vc = BFPhotosMaterialController()
+        vc.view.frame = CGRect(x: 0, y: cDevice_iPhoneNavBarAndStatusBarHei, width: cScreenWidth, height: cScreenHeigth - cDevice_iPhoneNavBarAndStatusBarHei)
+        vc.view.backgroundColor = .black
+        vc.selectedMaterialHandle = { [weak self] currentMaterialData, selectedPhotoData, _, _ in
+            if currentMaterialData?.isSelected ?? false{
+                self?.chosedAsset = currentMaterialData
+                if selectedPhotoData.count == 2 {
+                    cShowHUB(superView: nil, msg: "临时:最新选择的视频是有效的视频")
+                }
+            }else{
+                self?.chosedAsset = selectedPhotoData.first
+            }
+            
+        }
+        return vc
+    }()
+    
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        showNavigation()
+        photoMaterialVc.hiddenNavigation()
+
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        leftButton(image: nil, imageName: nil, tintColor: .white)
+        rightButtonItem(image: nil, title: "下一步   ", titleColor: .white)
+        navHeadImageView?.backgroundColor = .black
+        
+        addChildViewController(photoMaterialVc)
+        view.addSubview(photoMaterialVc.view)
+        
+    }
+    
+    override func rightBtnClick(sender _: UIButton) {
+        if let asset = self.chosedAsset{
+            let vc = BFRecordScreenController()
+            vc.asset = asset
+            navigationController?.pushViewController(vc, animated: true)
+        }else{
+            cShowHUB(superView: nil, msg: "需要选择一个视频")
+        }
+    }
+}

+ 9 - 0
Example/BFRecordScreenKit/RecordScreenController.swift

@@ -0,0 +1,9 @@
+//
+//  VideoChooseController.swift
+//  BFRecordScreenKit_Example
+//
+//  Created by 胡志强 on 2021/11/23.
+//  Copyright © 2021 CocoaPods. All rights reserved.
+//
+
+import Foundation

+ 26 - 1
Example/BFRecordScreenKit/ViewController.swift

@@ -7,18 +7,43 @@
 //
 
 import UIKit
+import BFFramework
+import BFRecordScreenKit
+import BFMaterialKit
+
 
 class ViewController: UIViewController {
 
+    lazy var addVideoBtn:UIButton = {
+        let btn = UIButton(type: .custom)
+//        btn.setTitle("Add", for: .normal)
+        btn.setImage(UIImage(named: "add"), for: .normal)
+        btn.addTarget(self, action: #selector(addVideo), for: .touchUpInside)
+        return btn
+    }()
+    
     override func viewDidLoad() {
         super.viewDidLoad()
-        // Do any additional setup after loading the view, typically from a nib.
+        view.backgroundColor = .black
+        
+        view.addSubview(addVideoBtn)
+        addVideoBtn.snp.makeConstraints { make in
+            make.width.height.equalTo(170)
+            make.center.equalToSuperview()
+        }
     }
 
     override func didReceiveMemoryWarning() {
         super.didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
     }
+    
+    @objc func addVideo(){
+        let vc = PhotoVideoListController()
+        vc.hidesBottomBarWhenPushed = true
+        self.navigationController?.pushViewController(vc, animated: true)
+    }
 
 }
 
+

+ 10 - 7
Example/Podfile

@@ -1,13 +1,16 @@
 use_frameworks!
 
-platform :ios, '9.0'
+platform :ios, '10.0'
+source 'https://github.com/CocoaPods/Specs.git'
+source 'https://git.yishihui.com/iOS/BFSpecs.git'
 
 target 'BFRecordScreenKit_Example' do
   pod 'BFRecordScreenKit', :path => '../'
-
-  target 'BFRecordScreenKit_Tests' do
-    inherit! :search_paths
-
-    
-  end
+  pod 'BFMaterialKit',    :path => '../../BFMaterialKit/'
+  pod 'BFCommonKit',      :path => '../../BFCommonKit/'
+  pod 'BFNetRequestKit',  :path => '../../BFNetRequestKit/'
+  pod 'BFFramework',      :path => '../../BFFramework/'
+  pod 'BFUIKit',          :path => '../../BFUIKit/'
+  
+  pod 'GPUImage'
 end

+ 197 - 0
Example/Podfile.lock

@@ -0,0 +1,197 @@
+PODS:
+  - Alamofire (5.4.4)
+  - AliyunOSSiOS (2.10.10)
+  - BFCommonKit (1.5.1):
+    - BFCommonKit/BFBase (= 1.5.1)
+    - BFCommonKit/BFCategorys (= 1.5.1)
+    - BFCommonKit/BFConfig (= 1.5.1)
+    - BFCommonKit/BFDebug (= 1.5.1)
+    - BFCommonKit/BFEnums (= 1.5.1)
+    - BFCommonKit/BFUtility (= 1.5.1)
+  - BFCommonKit/BFBase (1.5.1):
+    - Alamofire (= 5.4.4)
+    - BFCommonKit/BFCategorys
+    - BFCommonKit/BFConfig
+    - BFCommonKit/BFUtility
+    - SnapKit (= 5.0.1)
+  - BFCommonKit/BFCategorys (1.5.1):
+    - KingfisherWebP (= 1.3.0)
+  - BFCommonKit/BFConfig (1.5.1)
+  - BFCommonKit/BFDebug (1.5.1):
+    - BFCommonKit/BFCategorys
+  - BFCommonKit/BFEnums (1.5.1)
+  - BFCommonKit/BFUtility (1.5.1):
+    - Alamofire (= 5.4.4)
+    - BFCommonKit/BFCategorys
+    - BFCommonKit/BFConfig
+    - KeychainAccess (= 4.2.2)
+    - Kingfisher (= 6.3.1)
+    - KingfisherWebP (= 1.3.0)
+    - Toast-Swift (= 5.0.1)
+  - BFFramework (1.0.9):
+    - AliyunOSSiOS (= 2.10.10)
+    - BFCommonKit
+    - BFMaterialKit
+    - BFNetRequestKit
+    - Bugly (= 2.5.90)
+    - LMJHorizontalScrollText (= 2.0.2)
+    - MJRefresh (= 3.7.2)
+    - ObjectMapper (= 4.2.0)
+    - TXLiteAVSDK_Player (= 9.2.10637)
+    - WechatOpenSDK-Swift (= 1.8.7.1)
+  - BFMaterialKit (0.1.9):
+    - BFUIKit
+  - BFNetRequestKit (1.0.0):
+    - Alamofire (= 5.4.4)
+  - BFRecordScreenKit (0.1.0):
+    - BFCommonKit
+    - BFUIKit
+    - GPUImage
+  - BFUIKit (0.1.1):
+    - BFCommonKit
+    - BFUIKit/Comm (= 0.1.1)
+    - BFUIKit/Controller (= 0.1.1)
+    - BFUIKit/View (= 0.1.1)
+    - FDFullscreenPopGesture (= 1.1)
+    - Kingfisher (~> 6.0)
+    - MGSwipeTableCell (~> 1.0)
+    - MJRefresh (~> 3.0)
+    - RealmSwift (= 10.7.6)
+    - SnapKit (~> 5.0)
+    - SVProgressHUD (~> 2.0)
+  - BFUIKit/Comm (0.1.1):
+    - BFCommonKit
+    - FDFullscreenPopGesture (= 1.1)
+    - Kingfisher (~> 6.0)
+    - MGSwipeTableCell (~> 1.0)
+    - MJRefresh (~> 3.0)
+    - RealmSwift (= 10.7.6)
+    - SnapKit (~> 5.0)
+    - SVProgressHUD (~> 2.0)
+  - BFUIKit/Controller (0.1.1):
+    - BFCommonKit
+    - FDFullscreenPopGesture (= 1.1)
+    - Kingfisher (~> 6.0)
+    - MGSwipeTableCell (~> 1.0)
+    - MJRefresh (~> 3.0)
+    - RealmSwift (= 10.7.6)
+    - SnapKit (~> 5.0)
+    - SVProgressHUD (~> 2.0)
+  - BFUIKit/View (0.1.1):
+    - BFCommonKit
+    - FDFullscreenPopGesture (= 1.1)
+    - Kingfisher (~> 6.0)
+    - MGSwipeTableCell (~> 1.0)
+    - MJRefresh (~> 3.0)
+    - RealmSwift (= 10.7.6)
+    - SnapKit (~> 5.0)
+    - SVProgressHUD (~> 2.0)
+  - Bugly (2.5.90)
+  - FDFullscreenPopGesture (1.1)
+  - GPUImage (0.1.7)
+  - KeychainAccess (4.2.2)
+  - Kingfisher (6.3.1)
+  - KingfisherWebP (1.3.0):
+    - Kingfisher (~> 6.2)
+    - libwebp (>= 1.1.0)
+  - libwebp (1.2.1):
+    - libwebp/demux (= 1.2.1)
+    - libwebp/mux (= 1.2.1)
+    - libwebp/webp (= 1.2.1)
+  - libwebp/demux (1.2.1):
+    - libwebp/webp
+  - libwebp/mux (1.2.1):
+    - libwebp/demux
+  - libwebp/webp (1.2.1)
+  - LMJHorizontalScrollText (2.0.2)
+  - MGSwipeTableCell (1.6.11)
+  - MJRefresh (3.7.2)
+  - ObjectMapper (4.2.0)
+  - Realm (10.7.6):
+    - Realm/Headers (= 10.7.6)
+  - Realm/Headers (10.7.6)
+  - RealmSwift (10.7.6):
+    - Realm (= 10.7.6)
+  - SnapKit (5.0.1)
+  - SVProgressHUD (2.2.5)
+  - Toast-Swift (5.0.1)
+  - TXLiteAVSDK_Player (9.2.10637)
+  - WechatOpenSDK-Swift (1.8.7.1)
+
+DEPENDENCIES:
+  - BFCommonKit (from `../../BFCommonKit/`)
+  - BFFramework (from `../../BFFramework/`)
+  - BFMaterialKit (from `../../BFMaterialKit/`)
+  - BFNetRequestKit (from `../../BFNetRequestKit/`)
+  - BFRecordScreenKit (from `../`)
+  - BFUIKit (from `../../BFUIKit/`)
+  - GPUImage
+
+SPEC REPOS:
+  https://github.com/CocoaPods/Specs.git:
+    - Alamofire
+    - AliyunOSSiOS
+    - Bugly
+    - FDFullscreenPopGesture
+    - GPUImage
+    - KeychainAccess
+    - Kingfisher
+    - KingfisherWebP
+    - libwebp
+    - LMJHorizontalScrollText
+    - MGSwipeTableCell
+    - MJRefresh
+    - ObjectMapper
+    - Realm
+    - RealmSwift
+    - SnapKit
+    - SVProgressHUD
+    - Toast-Swift
+    - TXLiteAVSDK_Player
+    - WechatOpenSDK-Swift
+
+EXTERNAL SOURCES:
+  BFCommonKit:
+    :path: "../../BFCommonKit/"
+  BFFramework:
+    :path: "../../BFFramework/"
+  BFMaterialKit:
+    :path: "../../BFMaterialKit/"
+  BFNetRequestKit:
+    :path: "../../BFNetRequestKit/"
+  BFRecordScreenKit:
+    :path: "../"
+  BFUIKit:
+    :path: "../../BFUIKit/"
+
+SPEC CHECKSUMS:
+  Alamofire: f3b09a368f1582ab751b3fff5460276e0d2cf5c9
+  AliyunOSSiOS: b8f1dfc229cd9abf68c8ee0cb245c2d66e00dd96
+  BFCommonKit: 697a9d162da8ee14ec75cc0f5d8e26a38a6faafe
+  BFFramework: f77b349fadfcee2ca279d7826b06f65d9e06e67f
+  BFMaterialKit: a10f33e7748689a3eeffff3b18df9c350241ba8d
+  BFNetRequestKit: 6b200205bd1a9491c04f5a3e95301d37a547f96b
+  BFRecordScreenKit: 1397a4e40a5b7a02bb2b495473858f4f56657867
+  BFUIKit: 982c86edec8883b3e6b60cb3ee1297eae23d9e4a
+  Bugly: 88bc32c0acc6fef7b74d610f0319ee7560d6b9fe
+  FDFullscreenPopGesture: a8a620179e3d9c40e8e00256dcee1c1a27c6d0f0
+  GPUImage: 733a5f0fab92df9de1c37ba9df520a833ccb406d
+  KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
+  Kingfisher: 016c8b653a35add51dd34a3aba36b580041acc74
+  KingfisherWebP: dec17a5eb1af2658791bde1f93ae9a853678f826
+  libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
+  LMJHorizontalScrollText: ebc9b908db297f603c5b98c9b4e5f4582f5a14b8
+  MGSwipeTableCell: b804e4e450dee439c42250be90bd50458bf67fce
+  MJRefresh: 30997d30b347c8e9508a4db11e3a690da0c9b85a
+  ObjectMapper: 1eb41f610210777375fa806bf161dc39fb832b81
+  Realm: ed860452717c8db8f4bf832b6807f7f2ce708839
+  RealmSwift: e31c4ddbcc42ac879313d656b86f9ca539f6f4f4
+  SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb
+  SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6
+  Toast-Swift: 9b6a70f28b3bf0b96c40d46c0c4b9d6639846711
+  TXLiteAVSDK_Player: 300e6fc7262ae095ee13b18d7d821c5fae0996f9
+  WechatOpenSDK-Swift: 18a8f7b12e745c30acc013f72a9f8a25aad6e216
+
+PODFILE CHECKSUM: 73db905959405c43b432632a6186a85549c89648
+
+COCOAPODS: 1.11.2