Pārlūkot izejas kodu

Merge branch 'dev' of https://git.yishihui.com/iOS/BFRecordScreenKit into dev
合并代码

jsonwang 3 gadi atpakaļ
vecāks
revīzija
dae0d7d7e2

+ 27 - 15
BFRecordScreenKit/Classes/RecordScreen/Controller/BFMusicSearchController.swift

@@ -34,6 +34,26 @@ class BFMusicSearchController: BFBaseViewController {
         return p
     }()
     
+    lazy var searchTF : UITextField = {
+        let searchTF = UITextField()
+        let leftv = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 20))
+        let iv = UIImageView(frame: CGRect(x: 6, y: 0, width: 20, height: 20))
+        iv.contentMode = .scaleAspectFit
+        iv.image = imageInRecordScreenKit(by: "search")
+        leftv.addSubview(iv)
+        searchTF.leftView = leftv
+        searchTF.leftViewMode = .always
+        searchTF.clearButtonMode = .whileEditing
+        searchTF.placeholder = "歌名/歌手名"
+        searchTF.delegate = self
+        searchTF.returnKeyType = .search
+        searchTF.textColor = UIColor.white
+        searchTF.backgroundColor = UIColor.hexColor(hexadecimal: "#1d1d1d")
+        searchTF.layer.cornerRadius = 18
+        
+        return searchTF
+    }()
+    
     lazy var musicTb : UITableView = {
         let tb = UITableView(frame: .zero)
         tb.delegate = self
@@ -45,6 +65,12 @@ class BFMusicSearchController: BFBaseViewController {
         return tb
     }()
     
+    override func viewDidAppear(_ animated: Bool) {
+        super.viewDidAppear(animated)
+        
+        searchTF.becomeFirstResponder()
+    }
+    
     override func viewDidLoad() {
         super.viewDidLoad()
         
@@ -54,21 +80,7 @@ class BFMusicSearchController: BFBaseViewController {
         closeBtn.addTarget(self, action: #selector(closeAction), for: .touchUpInside)
         view.addSubview(closeBtn)
         
-        let searchTF = UITextField(frame: CGRect(x: 62, y: statusBarHeight + 4, width: cScreenWidth - 62 - 18, height: 36))
-        let leftv = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 20))
-        let iv = UIImageView(frame: CGRect(x: 6, y: 0, width: 20, height: 20))
-        iv.contentMode = .scaleAspectFit
-        iv.image = imageInRecordScreenKit(by: "search")
-        leftv.addSubview(iv)
-        searchTF.leftView = leftv
-        searchTF.leftViewMode = .always
-        searchTF.clearButtonMode = .whileEditing
-        searchTF.placeholder = "歌名/歌手名"
-        searchTF.delegate = self
-        searchTF.returnKeyType = .search
-        searchTF.textColor = UIColor.white
-        searchTF.backgroundColor = UIColor.hexColor(hexadecimal: "#1d1d1d")
-        searchTF.layer.cornerRadius = 18
+        searchTF.frame = CGRect(x: 62, y: statusBarHeight + 4, width: cScreenWidth - 62 - 18, height: 36)
         view.addSubview(searchTF)
 
         view.addSubview(musicTb)

+ 29 - 19
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -18,6 +18,7 @@ import GPUImage
 import Photos
 import UIKit
 import BFUploadKit
+import Kingfisher
 
 struct WithDrawModel {
     var type: Int // 0:拖动; 1:预览播放暂停 2: 录音结束  3: 删除录音
@@ -217,6 +218,7 @@ public class BFRecordScreenController: BFBaseViewController {
             voiceSettingBtn.isHidden = isRecording
             subtitleBtn.isHidden = isRecording
             soundSettingBtn.isHidden = isRecording
+            addMusicBtn.isHidden = isRecording
             recordBtn.setTitle(isRecording ? "record_pause".BFLocale : (currMediaType == .Camera ? "record_lz".BFLocale : "record_ly".BFLocale), for: .normal)
             recordBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#389AFF", alpha: isRecording ? 0.6 : 1)
             cameraFlipBtn.isHidden = !(!isRecording && (currMediaType == .Camera))
@@ -247,6 +249,7 @@ public class BFRecordScreenController: BFBaseViewController {
             soundSettingBtn.isHidden = isNormalPlaying
             voiceSettingBtn.isHidden = isNormalPlaying
             withDrawBtn.isHidden = isNormalPlaying
+            addMusicBtn.isHidden = isNormalPlaying
             updateRecordBtnStatus(needHidden: isNormalPlaying)
             cameraFlipBtn.isHidden = !(!isNormalPlaying && (currMediaType == .Camera) && !isDragingProgressSlder)
         }
@@ -523,14 +526,21 @@ public class BFRecordScreenController: BFBaseViewController {
     }()
     
     // 添加音乐设置
-    lazy var addMusicBtn: UIButton = {
-        let btn = UIButton(type: .custom)
+    lazy var addMusicBtn: BFCustomMusicBtn = {
+//        let btn = UIButton(type: .custom)
+//        btn.setImage(imageInRecordScreenKit(by: "addmusic"), for: .normal)
+//        btn.setTitle("选择音乐", for: .normal)
+//        btn.titleLabel?.font = UIFont.systemFont(ofSize: 13)
+//        btn.addTarget(self, action: #selector(addMusicAction), for: .touchDown)
+        
+        let btn = BFCustomMusicBtn(frame: CGRect.zero)
         btn.backgroundColor = UIColor.init(white: 0, alpha: 0.6)
         btn.layer.cornerRadius = 16
-        btn.setImage(imageInRecordScreenKit(by: "addmusic"), for: .normal)
-        btn.setTitle("选择音乐", for: .normal)
-        btn.titleLabel?.font = UIFont.systemFont(ofSize: 13)
-        btn.addTarget(self, action: #selector(addMusicAction), for: .touchDown)
+        btn.clickAction = {[weak self] in
+            guard let wself = self else { return }
+            
+            wself.addMusicAction()
+        }
         return btn
     }()
     
@@ -554,6 +564,7 @@ public class BFRecordScreenController: BFBaseViewController {
                         vc.choseAction = {[weak self] voiceModel in
                             guard let wself = self else { return }
                             wself.hadChoosed(music: voiceModel)
+                            wself.choseMusicPanel.searchModel = voiceModel
                         }
                         
                         vc.cutActionCallback = {[weak self] voiceModel in
@@ -1050,8 +1061,7 @@ public class BFRecordScreenController: BFBaseViewController {
         
         addMusicBtn.snp.makeConstraints { make in
             make.centerX.equalToSuperview()
-            make.top.equalTo(soundSettingBtn).offset(-8)
-            make.width.equalTo(100)
+            make.top.equalTo(soundSettingBtn).offset(-12)
             make.height.equalTo(32)
         }
 
@@ -2332,14 +2342,7 @@ public class BFRecordScreenController: BFBaseViewController {
         }
         
         rscurrentManager.play()
-        
-        subtitleBtn.isHidden = true
-        voiceSettingBtn.isHidden = true
-        soundSettingBtn.isHidden = true
-        withDrawBtn.isHidden = true
-        recordBtn.isHidden = true
-        deleteRecordBtn.isHidden = true
-        
+    
     }
 
     public func pause() {
@@ -2650,13 +2653,19 @@ public class BFRecordScreenController: BFBaseViewController {
         if let model = music {
             if let title = model.musicName {
                 audioSettingView.musicSlider.value = Float(model.volume)
-                addMusicBtn.setTitle(title, for: .normal)
+//                addMusicBtn.setTitle(title, for: .normal)
+//                addMusicBtn.kf.setImage(with: URL(string: model.avatarUrl), for: .normal)
+                
+                addMusicBtn.config(title: title, imgUrl: URL(string: model.avatarUrl))
             }else{
-                addMusicBtn.setTitle("选择音乐", for: .normal)
+//                addMusicBtn.setTitle("选择音乐", for: .normal)
+//                addMusicBtn.setImage(imageInRecordScreenKit(by: "addmusic"), for: .normal)
+                addMusicBtn.config()
             }
             // 设置music为背景音乐
             hadDowonloadMusic(model: model)
         }else {
+            addMusicBtn.config()
             BFLog(1, message: "无效音乐")
         }
     }
@@ -2674,7 +2683,8 @@ public class BFRecordScreenController: BFBaseViewController {
                 }else{
                     cShowHUB(superView: wself.view, msg: "音乐下载失败,请重新尝试")
                     wself.bgmModel = nil
-                    wself.addMusicBtn.setTitle("选择音乐", for: .normal)
+//                    wself.addMusicBtn.setTitle("选择音乐", for: .normal)
+                    wself.addMusicBtn.config()
                 }
             }
         }

+ 52 - 16
BFRecordScreenKit/Classes/RecordScreen/View/BFChooseMusicView.swift

@@ -24,8 +24,31 @@ class BFChooseMusicView: UIView {
     var cutActionCallback: ((PQVoiceModel) -> Void)?
 
     // 各类别音乐列表,以类别id为key
-    var musicArray = [Int64 : [PQVoiceModel]]()
-    
+    var musicDic = [Int64 : [PQVoiceModel]]()
+    
+    var searchModel : PQVoiceModel?{
+        didSet {
+            if let searchModel = searchModel {
+                if let catogory = categories.first(where: { mod in
+                    mod.tagName == "热门"
+                }){
+                    if let tid = catogory.tagId {
+                        var arr = [PQVoiceModel]()
+                        arr.append(searchModel)
+                        if let list = musicDic[tid]{
+                            arr.append(contentsOf: list)
+                        }
+                        musicDic[tid] = arr
+                        searchModel.isSelected = true
+                        chosedMusic?.isSelected = false
+                        chosedMusic = searchModel
+                        
+                        musicTb.reloadData()
+                    }
+                }
+            }
+        }
+    }
     // 选择的音乐类别
     var categorySelectIndex : Int = 1
     
@@ -42,7 +65,7 @@ class BFChooseMusicView: UIView {
     // 选中的音乐
     var chosedMusic : PQVoiceModel?
     
-    var chosedCell : BFMuicInfoCell?
+    var chosedIndexPath : IndexPath?
     
     var loadedTimeRangesObserver : NSKeyValueObservation?
 
@@ -181,9 +204,9 @@ class BFChooseMusicView: UIView {
                 guard let wself = self else { return }
                 
                 guard let ranges = change.newValue as? [CMTimeRange] else { return }
-                if let cell = wself.chosedCell, let totalDur = player.currentItem?.duration, totalDur.isValid,  CMTimeCompare(ranges.first?.duration ?? .zero, totalDur) >= 0{
+                if let indx = wself.chosedIndexPath, let cell = wself.musicTb.cellForRow(at: indx) as? BFMuicInfoCell, let totalDur = player.currentItem?.duration, totalDur.isValid,  CMTimeCompare(ranges.first?.duration ?? .zero, totalDur) >= 0{
                     if (player.currentItem?.asset as? AVURLAsset)?.url.absoluteString ?? "b" == cell.data?.musicPath ?? "a" {
-                        if cell.status == .loading{
+                        if cell.status != .playing{
                             cell.status = .playing
                         }
                     }
@@ -243,10 +266,10 @@ class BFChooseMusicView: UIView {
                 return
             }
             
-            if wself.musicArray[tagId] == nil {
-                wself.musicArray[tagId] = [PQVoiceModel]()
+            if wself.musicDic[tagId] == nil {
+                wself.musicDic[tagId] = [PQVoiceModel]()
             }
-            let oldDataMusic : [PQVoiceModel] = wself.musicArray[tagId]!
+            let oldDataMusic : [PQVoiceModel] = wself.musicDic[tagId]!
             
             if let tempArr = response as? [[String: Any]], tempArr.count > 0 {
                 for (_, dict) in tempArr.enumerated() {
@@ -266,7 +289,7 @@ class BFChooseMusicView: UIView {
             }
             
             if musicPageList.count > 0 {
-                wself.musicArray[tagId]!.append(contentsOf: musicPageList)
+                wself.musicDic[tagId]!.append(contentsOf: musicPageList)
                 if tagId == wself.categories[wself.categorySelectIndex].tagId{
                     wself.musicTb.reloadData()
                 }
@@ -297,11 +320,18 @@ class BFChooseMusicView: UIView {
         categoryView.reloadData()
     }
     
+    func choseCell() -> BFMuicInfoCell? {
+        if let indpx = chosedIndexPath, let cell = musicTb.cellForRow(at: indpx) as? BFMuicInfoCell {
+            return cell
+        }
+        return nil
+    }
     
     @objc func btnAction(btn:UIButton) {
         
         player.pause()
-        chosedCell?.status = .pause
+ 
+        choseCell()?.status = .pause
         
         switch btn.tag{
         case 1001:
@@ -322,7 +352,7 @@ class BFChooseMusicView: UIView {
     func cancelChooseMusic() {
         chosedMusic = nil
         player.pause()
-        chosedCell?.changeSelected(false)
+        choseCell()?.changeSelected(false)
     }
     
     @objc func dimiss(){
@@ -341,8 +371,14 @@ extension BFChooseMusicView:UITableViewDelegate, UITableViewDataSource {
                 wself.cutActionCallback?(data)
             }
         }
-        if let tagid = categories[categorySelectIndex].tagId, let arr = musicArray[tagid] {
+        if let tagid = categories[categorySelectIndex].tagId, let arr = musicDic[tagid] {
             cell.data = arr[indexPath.row]
+            if cell.data?.isSelected ?? false {
+                chosedIndexPath = indexPath
+                chosedMusic = cell.data
+            }else{
+                cell.status = .normal
+            }
         }
         
         return cell
@@ -354,19 +390,19 @@ extension BFChooseMusicView:UITableViewDelegate, UITableViewDataSource {
     
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         if categories.count > 1 {
-            return musicArray[categories[categorySelectIndex].tagId ?? 0]?.count ?? 0
+            return musicDic[categories[categorySelectIndex].tagId ?? 0]?.count ?? 0
         }
         return 0
     }
     
     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         if let cell = tableView.cellForRow(at: indexPath) as? BFMuicInfoCell {
-            
+            chosedMusic?.isSelected = false
             chosedMusic = cell.data
             chosedMusic?.isSelected = true
             cell.changeSelected(true)
             
-            chosedCell = cell
+            chosedIndexPath = indexPath
             
             if cell.status == .normal {
                 if let urlStr = cell.data?.musicPath, let url = URL(string: urlStr){
@@ -393,7 +429,7 @@ extension BFChooseMusicView:UITableViewDelegate, UITableViewDataSource {
         cell?.status = .normal
         cell?.changeSelected(false)
         
-        chosedCell = nil
+        chosedIndexPath = nil
         player.pause()
     }
 }

+ 83 - 0
BFRecordScreenKit/Classes/RecordScreen/View/BFCustomMusicBtn.swift

@@ -0,0 +1,83 @@
+//
+//  BFCustomMusicBtn.swift
+//  BFRecordScreenKit
+//
+//  Created by Harry on 2022/3/4.
+//
+
+import Foundation
+import Kingfisher
+
+
+class BFCustomMusicBtn : UIView {
+    var title : String = ""
+    var img : UIImage?
+    
+    var clickAction : (() -> Void)?
+    
+    fileprivate var titleL = UILabel()
+    fileprivate var imageV = UIImageView(image: imageInRecordScreenKit(by: "addmusic"))
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        
+        titleL.font = UIFont.systemFont(ofSize: 13)
+        titleL.text = "选择音乐"
+        titleL.textColor = UIColor.white
+        titleL.textAlignment = .left
+        titleL.lineBreakMode = .byTruncatingTail
+        
+        imageV.layer.cornerRadius = 16
+        imageV.layer.masksToBounds = true
+        
+        addSubview(imageV)
+        addSubview(titleL)
+        
+        
+        imageV.snp.makeConstraints { make in
+            make.left.equalTo(6)
+            make.right.equalTo(titleL.snp.left).offset(-4)
+            make.top.equalTo(3)
+            make.bottom.equalTo(-3)
+            make.width.equalTo(imageV.snp.height)
+            make.centerY.equalToSuperview()
+        }
+        
+        titleL.snp.makeConstraints { make in
+            make.left.equalTo(imageV.snp.right).offset(4)
+            make.right.equalTo(-8)
+            make.top.equalTo(2)
+            make.bottom.equalTo(-2)
+            make.centerY.equalToSuperview()
+            make.width.lessThanOrEqualTo(200)
+        }
+        
+        let btn = UIButton()
+        btn.addTarget(self, action: #selector(click), for: .touchUpInside)
+        addSubview(btn)
+        btn.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+    }
+    
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    @objc func click() {
+        clickAction?()
+    }
+    
+    func config(title:String? = "选择音乐", imgUrl:URL? = nil){
+        titleL.text = title ?? "选择音乐"
+        if imgUrl == nil {
+            imageV.image = imageInRecordScreenKit(by: "addmusic")
+        }else {
+            imageV.kf.setImage(with: imgUrl)
+        }
+        
+        setNeedsLayout()
+        layoutIfNeeded()
+        
+    }
+}

+ 6 - 4
BFRecordScreenKit/Classes/RecordScreen/View/Cell/BFMuicInfoCell.swift

@@ -38,13 +38,13 @@ class BFMuicInfoCell: UITableViewCell {
                 audioStateView.kf.setImage(with: URL(fileURLWithPath: currentBundle()!.path(forResource: "stuckPoint_music_playing", ofType: ".gif")!))
                 
             case .pause:
-                maskIV.image = imageInRecordScreenKit(by: "markSelectd")
+                maskIV.image = imageInRecordScreenKit(by: "markSeleced")
                 stopLoading()
                 audioStateView.isHidden = false
                 audioStateView.image = imageInRecordScreenKit(by: "stuckPoint_music_pause")
 
             case .loading:
-                maskIV.image = imageInRecordScreenKit(by: "markSelectd")
+                maskIV.image = imageInRecordScreenKit(by: "markSeleced")
                 audioStateView.image = imageInRecordScreenKit(by: "audioLoding")?.withRenderingMode(.alwaysTemplate)
                 loadingAnimation()
                 audioStateView.isHidden = false
@@ -63,9 +63,7 @@ class BFMuicInfoCell: UITableViewCell {
     lazy var maskIV : UIImageView = {
         let iv = UIImageView()
         iv.layer.masksToBounds = true
-        iv.layer.borderColor = UIColor.hexColor(hexadecimal: "#389AFF").cgColor
         iv.layer.cornerRadius = 21
-        iv.layer.borderWidth = 2
         iv.layer.masksToBounds = true
         iv.backgroundColor = UIColor.init(white: 0, alpha: 0.5)
         
@@ -116,6 +114,10 @@ class BFMuicInfoCell: UITableViewCell {
         if let data = data{
             iconIV.setNetImage(url: data.avatarUrl, placeholder: imageInCommon(by: "videomk_music_default")!)
             titleL.text = data.musicName
+            
+            changeSelected(data.isSelected)
+            
+        
         }
     }