diff --git a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate index 597a3b5..9446302 100644 Binary files a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate and b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 9c77ae3..1dd7fe4 100644 --- a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -32,8 +32,8 @@ endingColumnNumber = "9223372036854775807" startingLineNumber = "576" endingLineNumber = "576" - landmarkName = "CCHomeController" - landmarkType = "21"> + landmarkName = "imagePickerController(_:didFinishPickingMediaWithInfo:)" + landmarkType = "7"> diff --git a/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/Contents.json b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/Contents.json new file mode 100644 index 0000000..e082eff --- /dev/null +++ b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/icon@1x.png b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/icon@1x.png new file mode 100644 index 0000000..45cd00b Binary files /dev/null and b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/icon@1x.png differ diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift index 8cd125b..d72241c 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift @@ -13,7 +13,34 @@ class ZZHCustomPlayer: UIView { var avPlayer:AVPlayer? var avPlayerLayer:AVPlayerLayer? var timeSlider:ZZHCustomSlider? + var prePlayingState:Bool?//标记 在滑块拖动前,player的播放状态,以便在拖动完毕之后回复播放状态 + let playerPauseBgColor:UIColor = UIColor(r: 245, g: 245, b: 245, a: 0.2)//暂停时的背景颜色 + lazy var maskPlayerView:UIView? = {//播放按钮 背景 + let bgView = UIView() + bgView.backgroundColor = playerPauseBgColor + + bgView.addSubview(self.playStateImgView) + + self.playStateImgView.snp.makeConstraints { make in + make.centerX.centerY.equalToSuperview() + make.width.height.equalTo(40) + } + + let btn = UIButton() + bgView.addSubview(btn) + btn.addTarget(self, action: #selector(playOrPause(sender: )), for: .touchUpInside) + btn.snp.makeConstraints { make in + make.left.top.right.bottom.equalToSuperview() + } + return bgView + }() + + lazy var playStateImgView:UIImageView = { + let imgView = UIImageView() + imgView.image = UIImage(named: "custom_playBtn") + return imgView + }() override init(frame: CGRect) { super.init(frame: frame) @@ -32,9 +59,14 @@ class ZZHCustomPlayer: UIView { playerLayerBgView!.layer.addSublayer(avPlayerLayer!) playerLayerBgView?.backgroundColor = UIColor.orange + self.maskPlayerView?.frame = avPlayerLayer!.frame + playerLayerBgView?.addSubview(maskPlayerView!) + + + timeSlider = ZZHCustomSlider(frame: .zero) - timeSlider?.processChangeValueCallback = { value in - print("value:\(value)") + timeSlider?.processChangeValueCallback = { (value,isMoving) in + print("value:\(value) isMoving:\(isMoving)") } self.addSubview(timeSlider!) timeSlider!.snp.makeConstraints { make in @@ -47,7 +79,39 @@ class ZZHCustomPlayer: UIView { } + //暂停或者播放 + @objc func playOrPause(sender:UIButton) { + if sender.tag == 0 {//播放 + play(true) + sender.tag = 1 + print("bofang...") + } + else {//暂停 + print("暂停...") + play(false) + sender.tag = 0 + } + } + //内、外部共同使用该play接口 + func play(_ value:Bool) { + if value { + self.avPlayer?.play() + prePlayingState = true + } + else { + prePlayingState = false + self.avPlayer?.pause() + } + + updatePlayMaskView(value) + } + + //根据状态更新播放器遮罩视图显示与隐藏 + func updatePlayMaskView(_ value:Bool) { + playStateImgView.isHidden = value + self.maskPlayerView?.backgroundColor = value ? .clear : playerPauseBgColor + } override func draw(_ rect: CGRect) { super.draw(rect) diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift index 81a30d1..243dcd0 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift @@ -7,7 +7,7 @@ import Foundation import UIKit -typealias CustomSliderProcessChangeValueCallback = (_ currentValue:Float)->Void +typealias CustomSliderProcessChangeValueCallback = (_ currentValue:Float,_ isMoving:Bool)->Void class ZZHCustomSlider: UIView { var sHeight:CGFloat? var sLabel:UILabel? @@ -74,20 +74,27 @@ class ZZHCustomSlider: UIView { } //内部拖动更新当前滑块value:0~1 - func updateProcessValue(value:Float) { + func updateProcessValue(value:Float,isMoving:Bool) { self.timeSlider!.value = value guard let processChangeValueCallback else { return } - var currentValue = max(0, min(value, 1)) - //格式化为0.x - let formattedValue = String(format: "%.1f", currentValue) - currentValue = Float(formattedValue)! - if currentValue > preValue || currentValue < preValue { - preValue = currentValue - processChangeValueCallback(preValue) + if isMoving { + var currentValue = max(0, min(value, 1)) + //格式化为0.x + let formattedValue = String(format: "%.1f", currentValue) + currentValue = Float(formattedValue)! + + if currentValue > preValue || currentValue < preValue { + preValue = currentValue + processChangeValueCallback(preValue,isMoving) + } } + else { + processChangeValueCallback(preValue,isMoving) + } + } //外部播放时的更新当前滑块 @@ -108,7 +115,7 @@ class ZZHCustomSlider: UIView { if let th = touch { let touchPoint = th.location(in: self.timeSlider!) - updateProcessValue(value: Float(touchPoint.x / self.timeSlider!.frame.size.width)) + updateProcessValue(value: Float(touchPoint.x / self.timeSlider!.frame.size.width),isMoving: true) } } @@ -118,6 +125,8 @@ class ZZHCustomSlider: UIView { timeSlider!.isNormal = true self.updateSliderHeight(height: (self.sHeight)!) } + + updateProcessValue(value: preValue,isMoving: false) } override func touchesCancelled(_ touches: Set, with event: UIEvent?) { @@ -125,6 +134,7 @@ class ZZHCustomSlider: UIView { timeSlider!.isNormal = true self.updateSliderHeight(height: (self.sHeight)!) } + updateProcessValue(value: preValue,isMoving: false) }