فهرست منبع

修改数据结构准备多素材;
导出界面完成UI;
增加图标资源

harry 3 سال پیش
والد
کامیت
3885823d43

+ 6 - 0
Introduce/Assets.xcassets/Export/Contents.json

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

+ 21 - 0
Introduce/Assets.xcassets/Export/export_btn.imageset/Contents.json

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

BIN
Introduce/Assets.xcassets/Export/export_btn.imageset/export_btn@3x.png


+ 21 - 0
Introduce/Assets.xcassets/Export/export_saveall_h.imageset/Contents.json

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

BIN
Introduce/Assets.xcassets/Export/export_saveall_h.imageset/export_saveall_h@3x.png


+ 21 - 0
Introduce/Assets.xcassets/Export/export_saveall_n.imageset/Contents.json

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

BIN
Introduce/Assets.xcassets/Export/export_saveall_n.imageset/export_saveall_n@3x.png


+ 21 - 0
Introduce/Assets.xcassets/Export/export_saveonly_h.imageset/Contents.json

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

BIN
Introduce/Assets.xcassets/Export/export_saveonly_h.imageset/export_saveonly_h@3x.png


+ 21 - 0
Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/Contents.json

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

BIN
Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/export_saveonly_n@3x.png


+ 1 - 2
Introduce/Record/INIntrocudeController.swift

@@ -59,8 +59,7 @@ class INIntrocudeController: BFBaseViewController {
     
     @objc func exportAction(){
         let controller = INVideoExportController()
-        controller.export.voiceList = recordScreenVC.itemModels.first?.voiceStickers
-        controller.export.asset = recordScreenVC.avasset
+        controller.export.data = recordScreenVC.itemModels
         self.navigationController?.pushViewController(controller, animated: true)
     }
     

+ 166 - 26
Introduce/Record/INVideoExportController.swift

@@ -9,13 +9,15 @@ import Foundation
 import BFUIKit
 import Photos
 import BFRecordScreenKit
+import UIKit
 
 
 class INVideoExportController: BFBaseViewController {
     
     var videoAsset : AVURLAsset?
     var avplayerTimeObserver: NSKeyValueObservation?
-
+    let backV = UIView()
+    // 播放进度
     lazy var progreddL : UILabel = {
         let l = UILabel(frame: CGRect(x: 0, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth, height: 14))
         l.textAlignment = .center
@@ -26,15 +28,16 @@ class INVideoExportController: BFBaseViewController {
         return l
     }()
     
-    
+    // 合成进度指示条
     lazy var progressView : UIView = {
-        let v = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: 0, height: 10))
+        let v = UIView()
         v.backgroundColor = .red
         return v
     }()
     
+    // 合成进度百分比lable
     lazy var progressL : UILabel = {
-        let la = UILabel(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
+        let la = UILabel()
         la.textColor = .white
         la.textAlignment = .center
         la.text = "0%"
@@ -42,6 +45,41 @@ class INVideoExportController: BFBaseViewController {
         return la
     }()
     
+    lazy var saveAllBtn:UIButton = {
+        let saveAllBtn = UIButton()
+        saveAllBtn.setImage(UIImage(named: "export_saveall_n"), for: .normal)
+        saveAllBtn.setImage(UIImage(named: "export_saveall_h"), for: .selected)
+        saveAllBtn.addTarget(self, action: #selector(saveAllAction(btn:)), for: .touchUpInside)
+        saveAllBtn.isSelected = true
+        return saveAllBtn
+    }()
+    
+    lazy var saveOnlyBtn:UIButton = {
+        let saveOnlyBtn = UIButton()
+        saveOnlyBtn.setImage(UIImage(named: "export_saveonly_n"), for: .normal)
+        saveOnlyBtn.setImage(UIImage(named: "export_saveonly_h"), for: .selected)
+        saveOnlyBtn.addTarget(self, action: #selector(saveOnlyAction(btn:)), for: .touchUpInside)
+        return saveOnlyBtn
+    }()
+    
+    lazy var exportBtn : UIButton = {
+        let exportBtn = UIButton()
+        exportBtn.setTitle(" 保存到相册", for: .normal)
+        exportBtn.setTitleColor(.white, for: .normal)
+        exportBtn.setImage(UIImage(named: "export_btn"), for: .normal)
+        exportBtn.backgroundColor = ThemeStyleColor
+        exportBtn.addCorner(roundingCorners: .allCorners, corner: 8)
+        exportBtn.addTarget(self, action: #selector(exportNow), for: .touchUpInside)
+        return exportBtn
+    }()
+    
+    lazy var bottomView:UIView = {
+        let vv = UIView()
+        vv.backgroundColor = .black
+        
+        return vv
+    }()
+    
     lazy var avplayer : AVPlayer = {
         let avplayer = AVPlayer()
         avplayerTimeObserver = avplayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 100), queue: DispatchQueue.global()) {[weak self, weak avplayer] time in
@@ -66,20 +104,30 @@ class INVideoExportController: BFBaseViewController {
         
         export.progress = {[weak self] progress in
             DispatchQueue.main.async { [weak self] in
-                self?.progressView.frame = CGRect(x: 0, y: self?.navHeadImageView?.bottomY ?? 0, width: (cScreenWidth) * CGFloat(progress), height: 10)
-                self?.progressL.text = String(format: "%d%%", Int(progress*100))
+                if let sself = self {
+//                    let width = export.data?.first?.width ?? 0
+                    sself.progressL.text = String(format: "%d%%", Int(progress*100))
+                    sself.progressView.snp.updateConstraints { make in
+                        make.width.equalTo(cScreenWidth * CGFloat(progress))
+                    }
+                }
             }
         }
+        
         export.exportCompletion = {[weak self] (error, url) in
-            guard let strongSelf = self else {
-                return
-            }
-            
-            if let fileUrl = url {
-                DispatchQueue.main.async { [weak self] in
+            DispatchQueue.main.async { [weak self] in
+                guard let sself = self else {
+                    return
+                }
+                sself.bottomView.isHidden = false
+                sself.progreddL.isHidden = false
+                sself.progressView.isHidden = true
+                sself.progressL.isHidden = true
+                
+                if let fileUrl = url {
                     let item = AVPlayerItem(url: fileUrl)
-                    self?.avplayer.replaceCurrentItem(with: item)
-                    self?.avplayer.play()
+                    sself.avplayer.replaceCurrentItem(with: item)
+                    sself.avplayer.play()
                 }
             }
         }
@@ -107,26 +155,118 @@ class INVideoExportController: BFBaseViewController {
         navHeadImageView?.backgroundColor = .black
         leftButton(image: nil, imageName: nil, tintColor: UIColor.white)
         
-        let backV = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
+//        backV.frame = CGRect(x: 0, y: navHeadImageView?.bottomY ?? 0, width: cScreenWidth, height: cScreenWidth)
         backV.backgroundColor = .gray
+        backV.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
+
+        
+        addSubviews()
+        
+        export.prepareData()
+//        export.startExprot()
+
+    }
+    
+    func addSubviews(){
+        
         view.addSubview(backV)
-        view.addSubview(progressView)
-        view.addSubview(progressL)
-        view.addSubview(progreddL)
+        view.addSubview(bottomView)
+        
+        let playerLayer = AVPlayerLayer(player: avplayer)
+        backV.layer.addSublayer(playerLayer)
+        
+        backV.addSubview(progressView)
+        backV.addSubview(progressL)
+        backV.addSubview(progreddL)
+        
+        bottomView.addSubview(saveAllBtn)
+        bottomView.addSubview(saveOnlyBtn)
+        bottomView.addSubview(exportBtn)
+        
+        backV.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
+            make.top.equalTo(navHeadImageView!.snp.bottom)
+            make.bottom.equalTo(bottomView.snp.top)
+        }
+        
+        progressView.snp.makeConstraints { make in
+            make.center.height.equalToSuperview()
+            make.width.equalTo(0)
+        }
+        
+        progressL.snp.makeConstraints { make in
+            make.center.width.equalToSuperview()
+            make.height.equalTo(20)
+        }
+        
         progreddL.snp.makeConstraints { make in
-            make.top.equalTo(progressView.snp.bottom).offset(10)
-            make.centerX.equalTo(progressL)
+            make.bottom.equalToSuperview().offset(-10)
+            make.centerX.equalTo(backV)
             make.width.equalTo(100)
             make.height.equalTo(20)
         }
-
-        let playerLayer = AVPlayerLayer(player: avplayer)
-        playerLayer.frame = CGRect(x: 10, y: self.progressView.bottomY, width: cScreenWidth - 20, height: cScreenHeigth - self.progressView.bottomY - 10)
-        view.layer.addSublayer(playerLayer)
         
-        export.startExprot()
         
-        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
+        bottomView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
+            if #available(iOS 11.0, *) {
+                make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom)
+            } else {
+                make.bottom.equalToSuperview()
+            }
+        }
+        
+        exportBtn.snp.makeConstraints { make in
+            make.left.equalTo(saveAllBtn)
+            make.right.equalTo(saveOnlyBtn)
+            make.height.equalTo(50)
+            make.bottom.equalTo(-40)
+        }
+        
+        saveAllBtn.snp.makeConstraints { make in
+            make.left.equalTo(16)
+            make.bottom.equalTo(exportBtn.snp.top).offset(-21)
+            make.height.equalTo(70)
+            make.top.equalTo(28)
+        }
+        
+        saveOnlyBtn.snp.makeConstraints { make in
+            make.left.equalTo(saveAllBtn.snp.right).offset(16)
+            make.top.height.width.equalTo(saveAllBtn)
+            make.right.equalTo(-16)
+        }
+        
+        DispatchQueue.main.asyncAfter(deadline: .now()+0) {[weak self] in
+            playerLayer.frame = self!.backV.bounds
+        }
+
+    }
+    
+    //MARK: - 按钮事件
+    
+    @objc func exportNow(){
+        bottomView.isHidden = true
+        progressView.isHidden = false
+        progressL.isHidden = false
+        progreddL.isHidden = true
+        export.startExprot(synthesisAll:saveAllBtn.isSelected)
+    }
+    
+    @objc func saveAllAction(btn:UIButton){
+        if btn.isSelected {
+            return
+        }
+        btn.isSelected = true
+        saveOnlyBtn.isSelected = false
+        
+    }
+    
+    @objc func saveOnlyAction(btn:UIButton){
+        if btn.isSelected {
+            return
+        }
+        btn.isSelected = true
+        saveAllBtn.isSelected = false
     }
     
     @objc func play(){