123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- import UIKit
- import BFCommonKit
- class PQStuckPointCuttingView: UIView {
-
- private var videoDuration: CGFloat = 0
-
- private var stuckPointStartTime: CGFloat = 0
-
- private var stuckPointEndTime: CGFloat = 0
-
- private var cutStartTime: CGFloat = 0
-
- private var cutEndTime: CGFloat = 0
-
- private var cutFinishedStartTime: CGFloat {
- (scrollView.contentOffset.x / perSecondWidth) + (((scrollView.frame.width - videoCropView.frame.width) / 2 + 15) / perSecondWidth) + cutStartTime
- }
-
- private var cutFinishedEndTime: CGFloat {
- cutFinishedStartTime + (cutEndTime - cutStartTime)
- }
-
- private var videoProgress: CGFloat = 0
-
- private var maxCutTime: CGFloat = cDefaultMargin * 4
-
- private var minCutTime: CGFloat = 10
-
- private var timeRange: CGFloat = cDefaultMargin
-
- private var rateHeight: CGFloat = cDefaultMargin * 5
-
- private var timeLineWidth: CGFloat = 35
-
- private var timeLineMargin: CGFloat = 35
-
- private var timeHeight: CGFloat = cDefaultMargin * 4
-
- private var frequencyWidth: CGFloat = 1
-
- private var frequencyMargin: CGFloat = 4
-
- private var margin: CGFloat = cDefaultMargin * 3
-
- private var perSecondWidth: CGFloat = 0
-
- private var contentWidth: CGFloat = 0
-
- var videoRangeDidChanged: ((_ startTime: CGFloat, _ endTime: CGFloat) -> Void)?
-
- var videoProgressDidChanged: ((_ progress: CGFloat) -> Void)?
-
- var videoDidEndDragging: ((_ type: Int, _ startTime: CGFloat, _ endTime: CGFloat, _ progress: CGFloat) -> Void)?
-
- lazy var scrollView: UIScrollView = {
- let scrollView = UIScrollView(frame: bounds)
- scrollView.showsVerticalScrollIndicator = false
- scrollView.showsHorizontalScrollIndicator = false
- scrollView.bounces = false
- scrollView.delegate = self
- if #available(iOS 11.0, *) {
- scrollView.contentInsetAdjustmentBehavior = .never
- } else {
- }
- return scrollView
- }()
- lazy var rateView: UIView = {
- let rateView = UIView(frame: CGRect(x: 0, y: videoCropView.frame.minY + 16.5, width: scrollView.contentSize.width, height: rateHeight))
- rateView.backgroundColor = PQBFConfig.shared.otherTintColor
- return rateView
- }()
- lazy var videoCropView: PQVideoCutingOprateView = {
- var originX: CGFloat = perSecondWidth * (stuckPointStartTime + cutStartTime) + margin
- if contentWidth > scrollView.frame.width {
- originX = perSecondWidth * (stuckPointStartTime - cutStartTime) + margin
- }
- let videoCropView: PQVideoCutingOprateView = PQVideoCutingOprateView(frame: CGRect(x: margin, y: frame.height - 90, width: contentWidth - margin * 2, height: 90), duration: videoDuration, startTime: cutStartTime, endTime: cutEndTime, minDuration: minCutTime, maxDuration: maxCutTime)
- videoCropView.cutRangeDidChanged = { [weak self] cutStartTime, cutEndTime, _ in
- self?.cutStartTime = cutStartTime
- self?.cutEndTime = cutEndTime
- self?.videoProgress = 0
-
- if self?.videoRangeDidChanged != nil {
- self?.videoRangeDidChanged!(cutStartTime, cutEndTime)
- }
- }
- videoCropView.progressDidChanged = { [weak self] progress in
- self?.videoProgress = progress
- if self?.videoProgressDidChanged != nil {
- self?.videoProgressDidChanged!(progress)
- }
- }
- videoCropView.didEndDragging = { [weak self] type, startTime, endTime, progress in
- self?.videoProgress = 0
- if self?.videoDidEndDragging != nil {
- self?.videoDidEndDragging!(type, startTime, endTime, progress)
- }
- }
- return videoCropView
- }()
- override private init(frame: CGRect) {
- super.init(frame: frame)
- }
- required init?(coder _: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- init(frame: CGRect, duration: CGFloat, startTime: CGFloat, endTime: CGFloat) {
- super.init(frame: frame)
- videoDuration = duration
- if videoDuration < maxCutTime {
- maxCutTime = videoDuration
- }
-
- updateEndTime(startTime: startTime, endTime: endTime)
- }
-
-
-
- func updateEndTime(startTime: CGFloat, endTime: CGFloat) {
- stuckPointStartTime = startTime
- stuckPointEndTime = endTime
- if (stuckPointEndTime - stuckPointStartTime) > maxCutTime {
- stuckPointEndTime = stuckPointStartTime + maxCutTime
- }
- cutStartTime = startTime
- cutEndTime = endTime
- if cutEndTime > videoDuration {
- cutEndTime = videoDuration
- }
- backgroundColor = PQBFConfig.shared.styleBackGroundColor
- addSubview(scrollView)
- addData()
- }
- func addData() {
- perSecondWidth = (timeLineWidth + timeLineMargin) / timeRange
- frequencyMargin = perSecondWidth - frequencyWidth
- let tempWidth = videoDuration * perSecondWidth + timeLineWidth
- let totalCount = Int(videoDuration / timeRange)
- if (tempWidth + margin * 2) < scrollView.frame.width {
- margin = (scrollView.frame.width - tempWidth) / 2
- }
- contentWidth = tempWidth + margin * 2
- if contentWidth < scrollView.frame.width {
- contentWidth = scrollView.frame.width
- }
- scrollView.contentSize = CGSize(width: contentWidth, height: scrollView.frame.height)
- for index in 0 ... totalCount {
- let titleLab = UILabel(frame: CGRect(x: CGFloat(index) * (timeLineWidth + timeLineMargin) + margin, y: 0, width: timeLineWidth, height: timeHeight))
- titleLab.font = UIFont.systemFont(ofSize: 12)
- titleLab.textAlignment = .center
- titleLab.numberOfLines = 2
- titleLab.textColor = UIColor.hexColor(hexadecimal: "#999999")
- titleLab.text = "\((Float64(index) * Float64(timeRange)).formatDurationToHMS())\n·"
- scrollView.addSubview(titleLab)
- }
- if perSecondWidth > 0, cutEndTime > 0, cutStartTime < cutEndTime {
-
- configVoiceFrequency()
-
- if scrollView.frame.width < scrollView.contentSize.width {
- var offsetX = perSecondWidth * (stuckPointStartTime + (stuckPointEndTime - stuckPointStartTime) / 2) - scrollView.frame.width / 2 + timeLineWidth
- if offsetX < 0 {
- offsetX = 0
- }
- if offsetX > (scrollView.contentSize.width - scrollView.frame.width) {
- offsetX = (scrollView.contentSize.width - scrollView.frame.width)
- }
- scrollView.contentOffset = CGPoint(x: offsetX, y: 0)
- }
- scrollView.addSubview(rateView)
- scrollView.addSubview(videoCropView)
- }
- }
-
-
- func configVoiceFrequency() {
- let waveTotalCount = Int(videoDuration) / cFrequency.count
- var remainder = Int(ceil(videoDuration - CGFloat(waveTotalCount * cFrequency.count)))
- var totalWave: [CGFloat] = Array<CGFloat>.init()
- for _ in 0 ..< waveTotalCount {
- totalWave = totalWave + cFrequency
- }
- if remainder > cFrequency.count - 1 {
- remainder = cFrequency.count - 1
- }
- if remainder > 0 {
- totalWave = totalWave + cFrequency[0 ... remainder]
- }
- createWave(waveArr: totalWave)
- }
-
-
-
- func createWave(waveArr: [CGFloat]) {
- for (i, power) in waveArr.enumerated() {
-
- let hight: CGFloat = rateView.frame.height
-
- var startY: CGFloat = (hight - power) / 2.0
- if startY < 0 { startY = 0 }
-
- var endY: CGFloat = startY + power
- if endY > CGFloat(hight) { endY = hight }
-
- let linePath = UIBezierPath()
-
- let originX: CGFloat = CGFloat(i * Int(frequencyWidth + frequencyMargin)) + margin + timeLineWidth / 2
- linePath.move(to: CGPoint(x: originX, y: startY))
-
- linePath.addLine(to: CGPoint(x: originX, y: endY))
- let lineLayer = CAShapeLayer()
- lineLayer.lineWidth = frequencyWidth
- lineLayer.strokeColor = UIColor.hexColor(hexadecimal: "#999999").cgColor
- lineLayer.path = linePath.cgPath
- lineLayer.fillColor = UIColor.black.cgColor
- rateView.layer.insertSublayer(lineLayer, at: 0)
- }
- }
- deinit {
- BFLog(message: "卡点裁剪-裁剪视图销毁")
- }
- }
- extension PQStuckPointCuttingView: UIScrollViewDelegate {
- func scrollViewDidScroll(_: UIScrollView) {
-
- }
- @objc func scrollViewDidEndScrollingAnimation(scrollView _: UIScrollView) {
- BFLog(message: "拖拽结束 - 回调")
- }
- }
|