|
@@ -31,19 +31,19 @@ class BFVideoThumbProgressView: UIView {
|
|
var dragStartHandle: (() -> Void)?
|
|
var dragStartHandle: (() -> Void)?
|
|
var isDrag = false
|
|
var isDrag = false
|
|
|
|
|
|
- let thumbImageWidth : CGFloat = 70.0
|
|
|
|
|
|
+ let thumbImageWidth: CGFloat = 70.0
|
|
|
|
|
|
let fetchThumbStrategy: BFVideoThumbProgressStrategyProtocol = BFVideoThumbProgressStrategy()
|
|
let fetchThumbStrategy: BFVideoThumbProgressStrategyProtocol = BFVideoThumbProgressStrategy()
|
|
|
|
|
|
- var progress: Double = 0 { // 进度,秒为单位
|
|
|
|
|
|
+ var progress: Double = 0 { // 进度,秒为单位
|
|
didSet {
|
|
didSet {
|
|
updateProgress(progress: progress)
|
|
updateProgress(progress: progress)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
var thumbImgs = [UIImage]()
|
|
var thumbImgs = [UIImage]()
|
|
- var lastImg :UIImageView?
|
|
|
|
-
|
|
|
|
|
|
+ var lastImg: UIImageView?
|
|
|
|
+
|
|
lazy var progressView: BFAutolayoutScrollView = {
|
|
lazy var progressView: BFAutolayoutScrollView = {
|
|
let sv = BFAutolayoutScrollView()
|
|
let sv = BFAutolayoutScrollView()
|
|
sv.bounces = false
|
|
sv.bounces = false
|
|
@@ -77,7 +77,7 @@ class BFVideoThumbProgressView: UIView {
|
|
make.width.equalTo(3)
|
|
make.width.equalTo(3)
|
|
make.center.height.equalToSuperview()
|
|
make.center.height.equalToSuperview()
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
progressView.contentView.addSubview(progessIndicateBackV)
|
|
progressView.contentView.addSubview(progessIndicateBackV)
|
|
progessIndicateBackV.snp.makeConstraints { make in
|
|
progessIndicateBackV.snp.makeConstraints { make in
|
|
make.left.equalTo(width * 0.5)
|
|
make.left.equalTo(width * 0.5)
|
|
@@ -104,11 +104,11 @@ class BFVideoThumbProgressView: UIView {
|
|
func dealWithVideoThumb() {
|
|
func dealWithVideoThumb() {
|
|
guard let videoAsset = recordItem?.videoAsset else {
|
|
guard let videoAsset = recordItem?.videoAsset else {
|
|
// 可能icloud资源没回来,清空原有内容
|
|
// 可能icloud资源没回来,清空原有内容
|
|
- self.addThumbImages(images: [UIImage]())
|
|
|
|
|
|
+ addThumbImages(images: [UIImage]())
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- self.addThumbImages(images: recordItem!.thumbImgs)
|
|
|
|
- if recordItem!.thumbImgs.count > 0{
|
|
|
|
|
|
+ addThumbImages(images: recordItem!.thumbImgs)
|
|
|
|
+ if recordItem!.thumbImgs.count > 0 {
|
|
// 代表已经获取过了,不用在重新去获得
|
|
// 代表已经获取过了,不用在重新去获得
|
|
progessIndicateBackV.snp.remakeConstraints { make in
|
|
progessIndicateBackV.snp.remakeConstraints { make in
|
|
make.left.equalTo(width * 0.5)
|
|
make.left.equalTo(width * 0.5)
|
|
@@ -119,7 +119,7 @@ class BFVideoThumbProgressView: UIView {
|
|
}
|
|
}
|
|
return
|
|
return
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
let date = Date()
|
|
let date = Date()
|
|
let dur = videoAsset.duration.seconds
|
|
let dur = videoAsset.duration.seconds
|
|
if dur > 0 {
|
|
if dur > 0 {
|
|
@@ -131,24 +131,23 @@ class BFVideoThumbProgressView: UIView {
|
|
make.height.equalTo(6)
|
|
make.height.equalTo(6)
|
|
make.width.equalTo(CGFloat(count) * thumbImageWidth).priority(.high)
|
|
make.width.equalTo(CGFloat(count) * thumbImageWidth).priority(.high)
|
|
}
|
|
}
|
|
-
|
|
|
|
-
|
|
|
|
- recordItem!.splitVideoFileUrlFps(frames: count, firstImagesCount: Int(ceil(width/2.0/thumbImageWidth))) { [weak self, weak recordItem] hadGetAll, images in
|
|
|
|
|
|
+
|
|
|
|
+ recordItem!.splitVideoFileUrlFps(frames: count, firstImagesCount: Int(ceil(width / 2.0 / thumbImageWidth))) { [weak self, weak recordItem] hadGetAll, images in
|
|
guard let sself = self, let sitem = recordItem else {
|
|
guard let sself = self, let sitem = recordItem else {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
- BFLog(1, message: "获取缩略图:\(hadGetAll), \(Date().timeIntervalSince(date)), \( sitem.localPath ?? "aa")")
|
|
|
|
|
|
+ BFLog(1, message: "获取缩略图:\(hadGetAll), \(Date().timeIntervalSince(date)), \(sitem.localPath ?? "aa")")
|
|
sitem.thumbImgs.removeAll()
|
|
sitem.thumbImgs.removeAll()
|
|
sitem.thumbImgs.append(contentsOf: images)
|
|
sitem.thumbImgs.append(contentsOf: images)
|
|
-
|
|
|
|
|
|
+
|
|
// 不足数则补充足够帧数
|
|
// 不足数则补充足够帧数
|
|
- while (hadGetAll && sitem.thumbImgs.count < count && images.count > 0) {
|
|
|
|
|
|
+ while hadGetAll, sitem.thumbImgs.count < count, images.count > 0 {
|
|
sitem.thumbImgs.append(images.last!)
|
|
sitem.thumbImgs.append(images.last!)
|
|
}
|
|
}
|
|
if sitem.localPath == sself.recordItem!.localPath {
|
|
if sitem.localPath == sself.recordItem!.localPath {
|
|
sself.addThumbImages(images: sitem.thumbImgs)
|
|
sself.addThumbImages(images: sitem.thumbImgs)
|
|
- }else{
|
|
|
|
|
|
+ } else {
|
|
BFLog(1, message: "thumbImgs.count:\(sitem.thumbImgs.count)")
|
|
BFLog(1, message: "thumbImgs.count:\(sitem.thumbImgs.count)")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -175,7 +174,7 @@ class BFVideoThumbProgressView: UIView {
|
|
}
|
|
}
|
|
if images.count > 0 {
|
|
if images.count > 0 {
|
|
if let sself = self {
|
|
if let sself = self {
|
|
- if sself.lastImg != nil && sself.lastImg?.superview != nil {
|
|
|
|
|
|
+ if sself.lastImg != nil, sself.lastImg?.superview != nil {
|
|
sself.lastImg?.removeFromSuperview()
|
|
sself.lastImg?.removeFromSuperview()
|
|
}
|
|
}
|
|
for (i, img) in images.enumerated() {
|
|
for (i, img) in images.enumerated() {
|
|
@@ -203,31 +202,34 @@ class BFVideoThumbProgressView: UIView {
|
|
}
|
|
}
|
|
|
|
|
|
func appendThumb(progress: Double = 0) {
|
|
func appendThumb(progress: Double = 0) {
|
|
- let count: Int = Int(progress / 2)
|
|
|
|
- BFLog(message: "需要的图片个数:progress=\(progress),count=\(count)")
|
|
|
|
- if recordItem?.mediaType == .IMAGE, (progressView.contentView.subviews.count - 6) < count {
|
|
|
|
- guard let image = recordItem?.coverImg else {
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- if lastImg != nil && lastImg?.superview != nil {
|
|
|
|
- lastImg?.removeFromSuperview()
|
|
|
|
- }
|
|
|
|
- let lastIndex = progressView.contentView.subviews.count - 1
|
|
|
|
- for i in lastIndex ... lastIndex + 10 {
|
|
|
|
- let iv = UIImageView(image: image)
|
|
|
|
- iv.contentMode = .scaleAspectFill
|
|
|
|
- iv.clipsToBounds = true
|
|
|
|
- progressView.contentView.addSubview(iv)
|
|
|
|
- iv.snp.makeConstraints { make in
|
|
|
|
- make.left.equalTo(CGFloat(i) * CGFloat(thumbImageWidth) + width * 0.5)
|
|
|
|
- make.top.bottom.equalToSuperview()
|
|
|
|
- make.height.equalTo(50)
|
|
|
|
- make.width.equalTo(thumbImageWidth)
|
|
|
|
|
|
+ DispatchQueue.main.async { [weak self] in
|
|
|
|
+ guard let sslf = self else { return }
|
|
|
|
+ let count: Int = Int(progress / 2)
|
|
|
|
+ BFLog(message: "需要的图片个数:progress=\(progress),count=\(count)")
|
|
|
|
+ if sslf.recordItem?.mediaType == .IMAGE, (sslf.progressView.contentView.subviews.count - 6) < count {
|
|
|
|
+ guard let image = sslf.recordItem?.coverImg else {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ if sslf.lastImg != nil, sslf.lastImg?.superview != nil {
|
|
|
|
+ sslf.lastImg?.removeFromSuperview()
|
|
|
|
+ }
|
|
|
|
+ let lastIndex = sslf.progressView.contentView.subviews.count - 1
|
|
|
|
+ for i in lastIndex ... lastIndex + 10 {
|
|
|
|
+ let iv = UIImageView(image: image)
|
|
|
|
+ iv.contentMode = .scaleAspectFill
|
|
|
|
+ iv.clipsToBounds = true
|
|
|
|
+ sslf.progressView.contentView.addSubview(iv)
|
|
|
|
+ iv.snp.makeConstraints { make in
|
|
|
|
+ make.left.equalTo(CGFloat(i) * CGFloat(sslf.thumbImageWidth) + sslf.width * 0.5)
|
|
|
|
+ make.top.bottom.equalToSuperview()
|
|
|
|
+ make.height.equalTo(50)
|
|
|
|
+ make.width.equalTo(sslf.thumbImageWidth)
|
|
|
|
+ }
|
|
|
|
+ sslf.lastImg = iv
|
|
|
|
+ }
|
|
|
|
+ sslf.lastImg?.snp.makeConstraints { make in
|
|
|
|
+ make.right.equalTo(sslf.width * -0.5)
|
|
}
|
|
}
|
|
- lastImg = iv
|
|
|
|
- }
|
|
|
|
- lastImg?.snp.makeConstraints { make in
|
|
|
|
- make.right.equalTo(width * -0.5)
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -256,39 +258,39 @@ class BFVideoThumbProgressView: UIView {
|
|
|
|
|
|
extension BFVideoThumbProgressView: UIScrollViewDelegate {
|
|
extension BFVideoThumbProgressView: UIScrollViewDelegate {
|
|
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
|
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
|
- let totalW = recordItem?.mediaType == .VIDEO ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0)
|
|
|
|
|
|
+ let totalW = recordItem?.mediaType == .VIDEO ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0)
|
|
if recordItem?.mediaType == .VIDEO {
|
|
if recordItem?.mediaType == .VIDEO {
|
|
if isDrag {
|
|
if isDrag {
|
|
- dragScrollProgressHandle?(false, totalW > 0 ? Float((scrollView.contentOffset.x / totalW)) : 0)
|
|
|
|
|
|
+ dragScrollProgressHandle?(false, totalW > 0 ? Float(scrollView.contentOffset.x / totalW) : 0)
|
|
}
|
|
}
|
|
} else if recordItem?.mediaType == .IMAGE {
|
|
} else if recordItem?.mediaType == .IMAGE {
|
|
if isDrag {
|
|
if isDrag {
|
|
if scrollView.contentOffset.x > CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0 {
|
|
if scrollView.contentOffset.x > CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0 {
|
|
scrollView.contentOffset = CGPoint(x: CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0, y: 0)
|
|
scrollView.contentOffset = CGPoint(x: CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0, y: 0)
|
|
}
|
|
}
|
|
- dragScrollProgressHandle?(false, totalW > 0 ? Float((scrollView.contentOffset.x / totalW)) : 0)
|
|
|
|
|
|
+ dragScrollProgressHandle?(false, totalW > 0 ? Float(scrollView.contentOffset.x / totalW) : 0)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
|
|
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
|
|
isDrag = true
|
|
isDrag = true
|
|
- let totalW = recordItem?.mediaType == .VIDEO ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0)
|
|
|
|
|
|
+ let totalW = recordItem?.mediaType == .VIDEO ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0)
|
|
dragStartHandle?()
|
|
dragStartHandle?()
|
|
- dragScrollProgressHandle?(true, totalW > 0 ? Float((scrollView.contentOffset.x / totalW)) : 0)
|
|
|
|
|
|
+ dragScrollProgressHandle?(true, totalW > 0 ? Float(scrollView.contentOffset.x / totalW) : 0)
|
|
}
|
|
}
|
|
|
|
|
|
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
|
|
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
|
|
if !decelerate {
|
|
if !decelerate {
|
|
- let totalW = recordItem?.mediaType == .VIDEO ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0)
|
|
|
|
|
|
+ let totalW = recordItem?.mediaType == .VIDEO ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0)
|
|
isDrag = false
|
|
isDrag = false
|
|
- dragEndHandle?(totalW > 0 ? Float((scrollView.contentOffset.x / totalW)) : 0)
|
|
|
|
|
|
+ dragEndHandle?(totalW > 0 ? Float(scrollView.contentOffset.x / totalW) : 0)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
|
|
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
|
|
- let totalW = recordItem?.mediaType == .VIDEO ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0)
|
|
|
|
|
|
+ let totalW = recordItem?.mediaType == .VIDEO ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion ?? 0) * thumbImageWidth / 2.0)
|
|
isDrag = false
|
|
isDrag = false
|
|
- dragEndHandle?(totalW > 0 ? Float((scrollView.contentOffset.x / totalW)) : 0)
|
|
|
|
|
|
+ dragEndHandle?(totalW > 0 ? Float(scrollView.contentOffset.x / totalW) : 0)
|
|
}
|
|
}
|
|
}
|
|
}
|