浏览代码

Merge branch 'demo'

* demo:
  修改UI
  修改数据结构准备多素材; 导出界面完成UI; 增加图标资源
  修改数据模型
harry 3 年之前
父节点
当前提交
882a7b920d

+ 2 - 2
Introduce/Aarchitecture/AppDelegate.swift

@@ -15,7 +15,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
         // Override point for customization after application launch.
-        BFConfig.shared.styleColor = .nomal
+        BFConfig.shared.styleColor = .intrGreen
         BFConfig.shared.statusBarStyle = .light
         BFConfig.shared.styleBackGroundColor = UIColor.black
         BFConfig.shared.styleTitleColor = UIColor.white
@@ -27,7 +27,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         BFConfig.shared.hiddenMusicMask = false
         BFConfig.shared.otherTintColor = UIColor.hexColor(hexadecimal: "#333333")
         BFConfig.shared.statusBarStyle = .light
-        BFMaterialConfig.shared.choseType = .single
+//        BFMaterialConfig.shared.choseType = .single
         return true
     }
 

+ 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
+  }
+}

二进制
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
+  }
+}

二进制
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
+  }
+}

二进制
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
+  }
+}

二进制
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
+  }
+}

二进制
Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/export_saveonly_n@3x.png


+ 36 - 3
Introduce/Base.lproj/Main.storyboard

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19455" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="jg0-cF-aQT">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19455" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="VKd-TY-GhL">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
@@ -56,7 +56,7 @@
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="lCK-3W-RrG" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="1767" y="984"/>
+            <point key="canvasLocation" x="2475" y="865"/>
         </scene>
         <!--Tabbar Controller-->
         <scene sceneID="NzL-HE-kkO">
@@ -92,7 +92,40 @@
                 </navigationController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="krN-OB-qNx" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="1051" y="984"/>
+            <point key="canvasLocation" x="1733" y="865"/>
+        </scene>
+        <!--Navigation Controller-->
+        <scene sceneID="J4m-V3-ogm">
+            <objects>
+                <navigationController id="VKd-TY-GhL" sceneMemberID="viewController">
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="PQM-bg-KX0">
+                        <rect key="frame" x="0.0" y="44" width="414" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <connections>
+                        <segue destination="CZd-Kr-6NU" kind="relationship" relationship="rootViewController" id="VAt-Mb-25M"/>
+                    </connections>
+                </navigationController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="avb-WA-Ily" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="1459" y="1656"/>
+        </scene>
+        <!--开讲-->
+        <scene sceneID="WaO-hg-DoE">
+            <objects>
+                <viewController id="CZd-Kr-6NU" customClass="INRecorderController" customModule="Introduce" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="02E-8g-NQ9">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <viewLayoutGuide key="safeArea" id="JSA-4n-qyh"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="开讲" id="Rav-Yf-tVB"/>
+                    <navigationItem key="navigationItem" id="Kz5-8E-7Lg"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="jh4-5V-DjS" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="2352" y="1655"/>
         </scene>
     </scenes>
     <resources>

+ 9 - 4
Introduce/Record/INIntrocudeController.swift

@@ -12,7 +12,14 @@ import BFRecordScreenKit
 
 class INIntrocudeController: BFBaseViewController {
     
-    var asset:PHAsset?
+    var assets:[PHAsset]? {
+        didSet{
+            if let ass = assets {
+                recordScreenVC.assets = ass
+            }
+        }
+    }
+    
     let recordScreenVC = BFRecordScreenController()
     
     override func viewWillAppear(_ animated: Bool) {
@@ -40,7 +47,6 @@ class INIntrocudeController: BFBaseViewController {
         }
         
         addChild(recordScreenVC)
-        recordScreenVC.asset = asset
         recordScreenVC.view.frame = self.view.frame
         view.addSubview(recordScreenVC.view)
     }
@@ -53,8 +59,7 @@ class INIntrocudeController: BFBaseViewController {
     
     @objc func exportAction(){
         let controller = INVideoExportController()
-        controller.export.voiceList = recordScreenVC.recordList
-        controller.export.asset = recordScreenVC.avasset
+        controller.export.data = recordScreenVC.itemModels
         self.navigationController?.pushViewController(controller, animated: true)
     }
     

+ 3 - 10
Introduce/Record/INPhotoVideosController.swift

@@ -13,7 +13,7 @@ import BFRecordScreenKit
 import Photos
 
 class INPhotoVideosController: BFBaseViewController {
-    var chosedAsset:PHAsset?
+    var chosedAsset:[PHAsset]?
     lazy var albumController: BFPhotoAlbumController = {
         let albumController = BFPhotoAlbumController()
         albumController.mediaType = .video
@@ -52,14 +52,7 @@ class INPhotoVideosController: BFBaseViewController {
         vc.view.backgroundColor = .black
         vc.updateFrame(newFrame: CGRect(x: 0, y: cDevice_iPhoneNavBarAndStatusBarHei, width: cScreenWidth, height: cScreenHeigth - cDevice_iPhoneNavBarAndStatusBarHei - cDevice_iPhoneTabBarHei))
         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
-            }
+            self?.chosedAsset = selectedPhotoData
             
         }
         return vc
@@ -129,7 +122,7 @@ class INPhotoVideosController: BFBaseViewController {
     override func rightBtnClick(sender _: UIButton) {
         if let asset = self.chosedAsset{
             let vc = INIntrocudeController()
-            vc.asset = asset
+            vc.assets = asset
             navigationController?.pushViewController(vc, animated: true)
         }else{
             cShowHUB(superView: nil, msg: "需要选择一个视频")

+ 13 - 0
Introduce/Record/INRecorderController.swift

@@ -34,6 +34,19 @@ class INRecorderController: BFBaseViewController {
             make.width.height.equalTo(170)
             make.center.equalToSuperview()
         }
+        
+        let l = UILabel()
+        l.text = "选择视频,开始讲解"
+        l.textColor = .white
+        l.font = UIFont.systemFont(ofSize: 16)
+        l.textAlignment = .center
+        view.addSubview(l)
+        l.snp.makeConstraints { make in
+            make.top.equalTo(addVideoBtn.snp.bottom)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(200)
+            make.height.equalTo(24)
+        }
     }
 
     override func didReceiveMemoryWarning() {

+ 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(){

+ 16 - 16
Podfile

@@ -42,22 +42,22 @@ target 'Introduce' do
     end
   end
   
-def remove_swift_ui(code_file)
-  code_text = File.read(code_file)
-  code_text.gsub!(/#if canImport\(SwiftUI\) && canImport\(Combine\)(\n)/,"#if canImport(SwiftUI) && canImport(Combine) && (arch(arm64) || arch(x86_64))\n")
-  system("rm -rf " + code_file)
-  aFile = File.new(code_file, 'w+')
-  aFile.syswrite(code_text)
-  aFile.close()
-end
+  def remove_swift_ui(code_file)
+    code_text = File.read(code_file)
+    code_text.gsub!(/#if canImport\(SwiftUI\) && canImport\(Combine\)(\n)/,"#if canImport(SwiftUI) && canImport(Combine) && (arch(arm64) || arch(x86_64))\n")
+    system("rm -rf " + code_file)
+    aFile = File.new(code_file, 'w+')
+    aFile.syswrite(code_text)
+    aFile.close()
+  end
 
-def remove_swift_ui_realm (code_file)
-  code_text = File.read(code_file)
-  code_text.gsub!(/#if canImport\(SwiftUI\) && canImport\(Combine\) && swif/,'#if canImport(SwiftUI) && canImport(Combine) && (arch(arm64) || arch(x86_64)) && swif')
-  system("rm -rf " + code_file)
-  aFile = File.new(code_file, 'w+')
-  aFile.syswrite(code_text)
-  aFile.close()
-end
+  def remove_swift_ui_realm (code_file)
+    code_text = File.read(code_file)
+    code_text.gsub!(/#if canImport\(SwiftUI\) && canImport\(Combine\) && swif/,'#if canImport(SwiftUI) && canImport(Combine) && (arch(arm64) || arch(x86_64)) && swif')
+    system("rm -rf " + code_file)
+    aFile = File.new(code_file, 'w+')
+    aFile.syswrite(code_text)
+    aFile.close()
+  end
 
 end