Browse Source

撤销优化

胡志强 3 years ago
parent
commit
12f9426fd9

+ 2 - 8
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenBaseManager.swift

@@ -21,14 +21,8 @@ class BFRecordScreenBaseManager : NSObject{
     var progreddL : UILabel?
     var progressThumV: BFVideoThumbProgressView?
     
-    var recordItem : BFRecordItemModel?{
-        didSet{
-              //mdf by ak 这里先注释上否则会导致 BFRecordScreenController 类加的fetchPlayItemCallBack 不会被调用不能执行转换操作
-//            recordItem?.fetchPlayItemCallBack = {[weak self] model in
-//                self?.resetEnv()
-//            }
-        }
-    }
+    var recordItem : BFRecordItemModel?
+    
     var playView : GPUImageView?
     var filter = GPUImageFilter()
     

+ 22 - 4
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -34,6 +34,12 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     var rendView = GPUImageView()
     var cameraProgressV: BFCameraProgressView?
     
+    override var recordItem : BFRecordItemModel? {
+        didSet{
+            cameraProgressV?.recordItem = recordItem
+        }
+    }
+
     // 录制完成回调
     var hasInitCallBack : (()->Void)?
     var cameraFlipHandle : ((Bool) -> Void)?
@@ -132,7 +138,6 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             cShowHUB(superView: nil, msg: "option_fail_camera".BFLocale)
             return
         }
-        cameraProgressV?.recordItem = recordItem
         resetThumbImg()
         
         initplayer()
@@ -269,7 +274,6 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
                 }
             }else {
                 wself.videoModel.locationPath = "nil"
-//                wself.revertLast()
                 wself.recordEndCallBack?(false, nil)
             }
         }
@@ -577,6 +581,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         }
     }
     
+    // 
     override func changeRecordMaterail(){
         //
         if recordItem?.videoStickers.count ?? 0 == 0 {
@@ -625,9 +630,22 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             guard let wself = self else { return }
             
             wself.progreddL?.text = CMTimeGetSeconds(progress).formatDurationToHMS()
-            if wself.recordItem?.thumbImgs.count ?? 0 > 0 {
-                wself.cameraProgressV?.updateCellWidth(progress: progress, increaseTime: wself.increaseTime)
+            
+            // 刷新之后的sticker
+            if wself.recordItem?.thumbImgs.count ?? 0 > 0, let sticker = wself.recordItem?.videoStickers.first(where: { mod in
+                CMTimeCompare(mod.timelineCMIn, progress) <= 0 && CMTimeCompare(mod.timelineCMOut, progress) >= 0
+            }) {
+                wself.recordItem?.videoStickers.forEach({ mod in
+                    if mod.timelineCMOut.seconds > progress.seconds {
+//                        BFLog(1, message: "insert before: \(mod.timelineCMIn.seconds)")
+                        mod.timelineCMIn = mod.timelineCMIn + wself.increaseTime
+                        mod.timelineCMOut = mod.timelineCMOut + wself.increaseTime
+//                        BFLog(1, message: "insert after: \(mod.timelineCMIn.seconds)")
+                    }
+                })
+                wself.cameraProgressV?.updateCellWidth(sticker: sticker, progress: progress)
             }
+            
         }
     }
     

+ 48 - 18
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -70,9 +70,9 @@ public class BFRecordScreenController: BFBaseViewController {
         
         // MARK: 摄像头结束回调
         m.recordEndCallBack = { [weak self] isSuccess, sticker in
-            guard let wself = self, let sticker = sticker else { return }
+            guard let wself = self else { return }
             
-            if isSuccess{
+            if isSuccess,  let sticker = sticker{
                 wself.rscurrentManager.currentAssetProgress = sticker.timelineCMOut
                 let dur = wself.rscmanager.recordItem?.videoStickers.reduce(0, { partialResult, mod in
                     (mod.timelineCMOut - mod.timelineCMIn).seconds + partialResult
@@ -1381,7 +1381,7 @@ public class BFRecordScreenController: BFBaseViewController {
             let model = itemModels[currItemModelIndex].voiceStickers[isStopAtRecordRange]
             itemModels[currItemModelIndex].voiceStickers.remove(at: isStopAtRecordRange)
             indirectionView?.deleteItem(index: isStopAtRecordRange)
-            var event = WithDrawModel(type: 3, timestamp: currentAssetProgress, deletedVoices: [model], recordItem: rscurrentManager.recordItem!)
+            var event = WithDrawModel(type: 3, timestamp: currentAssetProgress, recordItem: rscurrentManager.recordItem!.mutableCopy() as! BFRecordItemModel)
             event.deletedTittles = deleteTitles(voiceModel: model)
             events.append(event)
 
@@ -1429,7 +1429,11 @@ public class BFRecordScreenController: BFBaseViewController {
             BFLog(message: "录音机初始化错误!!!")
             return
         }
-
+        
+        // 添加撤销记录点
+        let event = WithDrawModel(type: 2, timestamp: currentAssetProgress, recordItem: rscurrentManager.recordItem!.mutableCopy() as! BFRecordItemModel)
+        events.append(event)
+        
         DispatchQueue.global().async {[weak self] in
             guard let wself = self else { return }
             
@@ -1444,9 +1448,7 @@ public class BFRecordScreenController: BFBaseViewController {
             wself.recorderManager?.startRecord()
             wself.recorderManager?.audioRecorder?.startNeoNui(wself.NeoNuiToken ?? "", appid: wself.NeoNuiAPPID ?? "")
     
-            // 添加撤销记录点
-            let event = WithDrawModel(type: 2, timestamp: model.startCMTime, recordItem: wself.rscurrentManager.recordItem!)
-            wself.events.append(event)
+
         }
 
         
@@ -1561,8 +1563,9 @@ public class BFRecordScreenController: BFBaseViewController {
                     wself.resetCurrentProgress()
                 }
             // 移除
-                
-                wself.resetAllIndirectionView()
+                if wself.currMediaType != .Camera{
+                    wself.resetAllIndirectionView()
+                }
             }
         }
         recorderManager?.voiceModel = nil
@@ -1729,7 +1732,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 canInsertVideo = true
                 
                 changeProgress(changCMTime: endTime!)
-                progressThumV.progress = endTime!.seconds
+                progressThumV.progress = endTime!
                 
                 BFLog(1, message: "可以插入录音")
             }
@@ -1790,12 +1793,39 @@ public class BFRecordScreenController: BFBaseViewController {
     func recoverRecord() {
         if let action = events.last {
             // 重置播放器进度,按钮状态,缩略图展示,当前进度
-            rscurrentManager.recordItem = action.recordItem
-            changeProgress(changCMTime: action.timestamp)
-            progressThumV.progress = action.timestamp.seconds
-            searchStopAtRecordRange()
-            resetAllIndirectionView()
+            if action.type > 1 {
+                rscurrentManager.recordItem = action.recordItem
+                itemModels[currItemModelIndex] = action.recordItem
+            }
+            
             events.removeLast()
+            
+            let dur = itemModels[currItemModelIndex].materialDuraion.seconds
+            changeProgress(changCMTime: (dur > 0) ? action.timestamp : .zero)
+            
+            isDragingProgressSlder = false
+            currentPlayRecordIndex = -1
+            BFLog(3, message: "重置播放index-\(#function) = \(currentPlayRecordIndex)")
+            hadPrepareToPlayRecord = false
+            progressThumV.progress = action.timestamp
+
+            if let event = events.last {
+                changeWithDrawBtnLayout(event.type)
+            } else {
+                changeWithDrawBtnLayout(0)
+                withDrawBtn.isEnabled = false
+            }
+            searchStopAtRecordRange()
+            let itemModel = itemModels[currItemModelIndex]
+            /// 重绘录音进度视图
+            if action.type > 1 {
+                resetAllIndirectionView()                
+            }
+            // 如果是图片需重置播放按钮
+            if itemModel.mediaType != .Video {
+                playBtn.isSelected = itemModels[currItemModelIndex].voiceStickers.count <= 0
+                playBtn.isHidden = playBtn.isSelected
+            }
         }
     }
     
@@ -2049,7 +2079,7 @@ public class BFRecordScreenController: BFBaseViewController {
         if isEndPlay || (currMediaType == .Image && CMTimeCompare(currentAssetProgress, itemModels[currItemModelIndex].materialDuraion) >= 0) {
             isEndPlay = false
             assetPlayer.seek(to: CMTime.zero)
-            progressThumV.progress = 0
+            progressThumV.progress = .zero
             currentPlayRecordIndex = -1
             BFLog(3, message: "重置播放index-\(#function) = \(currentPlayRecordIndex)")
 
@@ -2232,7 +2262,7 @@ public class BFRecordScreenController: BFBaseViewController {
                     wself.progreddL.text = String(format: "%@", CMTimeGetSeconds(time).formatDurationToHMS())
                     let su = !wself.isDragingProgressSlder || wself.isRecording || wself.isNormalPlaying
                     if su { // 不拖动,正常播放和录音时更新进度条
-                        wself.progressThumV.progress = time.seconds
+                        wself.progressThumV.progress = time
                     }
                     // 更新字幕
                     if !wself.isRecording {
@@ -2659,7 +2689,7 @@ public extension BFRecordScreenController {
             }
 //            BFLog(1, message: "更新录音进度\(#function)-\(wself.currentAssetProgress.seconds ?? 0)")
             wself.progreddL.text = String(format: "%@", (wself.currentAssetProgress.seconds).formatDurationToHMS())
-            wself.progressThumV.progress = (wself.currentAssetProgress.seconds)
+            wself.progressThumV.progress = wself.currentAssetProgress
             wself.updateSubtitle(time: wself.currentAssetProgress)
         }
     }

+ 38 - 45
BFRecordScreenKit/Classes/RecordScreen/View/ProgressView/BFCameraProgressView.swift

@@ -10,6 +10,7 @@ import BFCommonKit
 import BFUIKit
 import CoreMedia
 import UIKit
+import BFMediaKit
 
 class BFCameraProgressView: BFProgressBaseView {
     
@@ -81,11 +82,11 @@ class BFCameraProgressView: BFProgressBaseView {
                             let wid = sticker.timelineCMOut.seconds * 70.0 / 5.0 - (lastiv.rightX - cScreenWidth / 2.0)
                             let wid0 = floor(wid * UIScreen.main.scale) /  UIScreen.main.scale
                             iv.frame = CGRect(x: lastiv.rightX, y: lastiv.y, width: wid0, height: 50)
+                            BFLog(1, message: "frame: new \(wid0)")
                             if wself.newRecordLine {
                                 lastiv.isHiddenBord = false
                                 wself.newRecordLine = false
                             }
-                            BFLog(1, message: "frame: new \(wid0)")
                             
                         }
                     }
@@ -143,59 +144,51 @@ class BFCameraProgressView: BFProgressBaseView {
     }
     
     //
-    func updateCellWidth(progress:CMTime, increaseTime:CMTime) {
-        if let sticker = recordItem?.videoStickers.first(where: { mod in
-            CMTimeCompare(mod.timelineCMIn, progress) <= 0 &&  CMTimeCompare(mod.timelineCMOut, progress) >= 0
-        }) {
-            if let img = sticker.thumImgs?.last {
-                if let lastiv = imageViews.first(where: { v in
-                    v.image == img
-                }){
-                    let wid = progress.seconds * 70.0 / 5.0 - (lastiv.x - cScreenWidth / 2.0)
-                    let wid0 = min(floor(wid * UIScreen.main.scale) /  UIScreen.main.scale, 70)
-                    
-                    if wid0 <= lastiv.width {
-                        return
-                    }
-                    var frame = lastiv.frame
-                    let offsetx = wid0 - frame.size.width
-                    frame.size.width = wid0
-                    lastiv.frame = frame
-                    
-                    imageViews.forEach { iv in
-                        if iv.rightX > lastiv.rightX, offsetx > 0 {
-                            let frame = iv.frame
-                            iv.frame = frame.offsetBy(dx: offsetx, dy: 0)
-                        }
-                    }
-                }
-            }
-
-            let p = CGPoint(x: progress.seconds * 70 / 5.0, y: 0)
-            progressView.contentOffset = p
-//            progressView.contentSize = CGSize(width: p.x + cScreenWidth, height: 50)
-    
-            // 刷新之后的sticker
-            recordItem?.videoStickers.forEach({ mod in
-                if mod.timelineCMOut.seconds > progress.seconds {
-                    BFLog(1, message: "insert progress:\(progress.seconds), start:\(sticker.timelineCMIn.seconds), end:\(sticker.timelineCMOut.seconds)")
-                    BFLog(1, message: "insert before: \(mod.timelineCMIn.seconds)")
-                    mod.timelineCMIn = mod.timelineCMIn + increaseTime
-                    mod.timelineCMOut = mod.timelineCMOut + increaseTime
-                    BFLog(1, message: "insert after: \(mod.timelineCMIn.seconds)")
+    func updateCellWidth(sticker:PQEditVisionTrackMaterialsModel, progress:CMTime) {
 
+        if let img = sticker.thumImgs?.last {
+            if let lastiv = imageViews.first(where: { v in
+                v.image == img
+            }){
+                let wid = progress.seconds * 70.0 / 5.0 - (lastiv.x - cScreenWidth / 2.0)
+                let wid0 = min(floor(wid * UIScreen.main.scale) /  UIScreen.main.scale, 70)
+                
+                if wid0 <= lastiv.width {
+                    return
+                }
+                var frame = lastiv.frame
+                let offsetx = wid0 - frame.size.width
+                frame.size.width = wid0
+                lastiv.frame = frame
+                
+                imageViews.forEach { iv in
+                    if iv.rightX > lastiv.rightX, offsetx > 0 {
+                        let frame = iv.frame
+                        iv.frame = frame.offsetBy(dx: offsetx, dy: 0)
+                    }
                 }
-            })
-            if let last = recordItem?.videoStickers.last {
-                progressView.contentSize = CGSize(width: last.timelineCMOut.seconds * 70 / 5.0 + cScreenWidth, height: 50)
             }
-            BFLog(1, message: "insert contentSize: \(progressView.contentSize.width),offset: \(progressView.contentOffset.x)")
         }
         
+        let p = CGPoint(x: progress.seconds * 70 / 5.0, y: 0)
+        progressView.contentOffset = p
+        //            progressView.contentSize = CGSize(width: p.x + cScreenWidth, height: 50)
+        
+        if let last = recordItem?.videoStickers.last {
+            progressView.contentSize = CGSize(width: last.timelineCMOut.seconds * 70 / 5.0 + cScreenWidth, height: 50)
+        }
+//        BFLog(1, message: "insert contentSize: \(progressView.contentSize.width),offset: \(progressView.contentOffset.x)")
+        
     }
     
+    // 结束本次录制
     func changeSepline(img:UIImage){
         newRecordLine = true
+        if img != recordItem?.thumbImgs.last {
+            imageViews.first { iv in
+                iv.image == img
+            }?.isHiddenBord = false
+        }
     }
 }
 

+ 4 - 4
BFRecordScreenKit/Classes/RecordScreen/View/ProgressView/BFVideoThumbProgressView.swift

@@ -17,7 +17,7 @@ class BFVideoThumbProgressView: BFProgressBaseView {
         didSet {
             // 指针回归
 //            BFLog(1, message: "new recorditem")
-            progress = 0
+            progress = .zero
             if recordItem?.mediaType == .Video {
                 
                 DispatchQueue.main.async {[weak self] in
@@ -45,9 +45,9 @@ class BFVideoThumbProgressView: BFProgressBaseView {
 
     let fetchThumbStrategy: BFVideoThumbProgressStrategyProtocol = BFVideoThumbProgressStrategy()
 
-    var progress: Double = 0 { // 进度,秒为单位
+    var progress: CMTime = .zero { // 进度,秒为单位
         didSet {
-            updateProgress(progress: progress)
+            updateProgress(progress: progress.seconds)
         }
     }
 
@@ -204,7 +204,7 @@ class BFVideoThumbProgressView: BFProgressBaseView {
                     
                     wself.lastImg = iv
                 }
-                BFLog(1, message: "last img \(wself.lastImg), \(images.count)")
+
                 wself.progressView.contentView.setNeedsLayout()
                 wself.progressView.contentView.layoutIfNeeded()
                 if wself.recordItem?.mediaType == .Image {

+ 5 - 3
BFRecordScreenKit/Classes/BFRecordItemModel.swift → BFRecordScreenKit/Classes/RecordScreen/ViewModel/BFRecordItemModel.swift

@@ -58,13 +58,15 @@ public class BFRecordItemModel: NSObject {
 
         
         self.voiceStickers.forEach { mod in
-            new.voiceStickers.append(mod.mutableCopy() as! PQVoiceModel)
+            new.voiceStickers.append(mod.copy() as! PQVoiceModel)
         }
         self.videoStickers.forEach { mod in
-            new.videoStickers.append(mod.mutableCopy() as! PQEditVisionTrackMaterialsModel)
+            let copymod = mod.copy() as! PQEditVisionTrackMaterialsModel
+            copymod.thumImgs = mod.thumImgs
+            new.videoStickers.append(copymod)
         }
         self.titleStickers.forEach { mod in
-            new.titleStickers.append(mod.mutableCopy() as! PQEditSubTitleModel)
+            new.titleStickers.append(mod.copy() as! PQEditSubTitleModel)
         }
         new.thumbImgs.append(contentsOf: self.thumbImgs)