|
@@ -9,6 +9,7 @@
|
|
|
import UIKit
|
|
|
import RxSwift
|
|
|
import RxCocoa
|
|
|
+import JXSegmentedView
|
|
|
|
|
|
class PublishEditNewVideoView: UIView {
|
|
|
|
|
@@ -23,8 +24,13 @@ class PublishEditNewVideoView: UIView {
|
|
|
}
|
|
|
}
|
|
|
weak var observe : NSObjectProtocol?
|
|
|
+
|
|
|
+ /// 路径
|
|
|
var taskPath : String?
|
|
|
+ /// 是否正在播放
|
|
|
var isPlaying : Bool = true
|
|
|
+ /// 滤镜选中的selected
|
|
|
+ var selectedIndex : Int = 0
|
|
|
|
|
|
override init(frame: CGRect) {
|
|
|
super.init(frame: frame)
|
|
@@ -48,6 +54,8 @@ class PublishEditNewVideoView: UIView {
|
|
|
backgroundColor = UIColor.black
|
|
|
addSubview(editorPreview)
|
|
|
addSubview(publishEditNewVideoSetView)
|
|
|
+ addSubview(effectFilterView)
|
|
|
+ addSubview(segmentedView)
|
|
|
}
|
|
|
|
|
|
/// 布局
|
|
@@ -55,6 +63,14 @@ class PublishEditNewVideoView: UIView {
|
|
|
publishEditNewVideoSetView.snp.makeConstraints { (make) in
|
|
|
make.edges.equalToSuperview()
|
|
|
}
|
|
|
+
|
|
|
+ // 调速的View
|
|
|
+ segmentedView.snp.makeConstraints { (make) in
|
|
|
+ make.bottom.equalTo(-(98+kSafeTabBarHeight))
|
|
|
+ make.left.equalTo(14)
|
|
|
+ make.right.equalTo(-14)
|
|
|
+ make.height.equalTo(40)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// 设置数据
|
|
@@ -67,24 +83,30 @@ class PublishEditNewVideoView: UIView {
|
|
|
UIViewController.topMost?.navigationController?.popViewController(animated: true)
|
|
|
}).disposed(by: disposeBag)
|
|
|
|
|
|
+ // 音乐
|
|
|
+ publishEditNewVideoSetView.musicButton.rx.tap.subscribe(onNext: {[weak self] (data) in
|
|
|
+ guard let strongSelf = self else { return }
|
|
|
+ strongSelf.showHiddenSegmentedView(isHidden: true)
|
|
|
+ }).disposed(by: disposeBag)
|
|
|
+
|
|
|
+ // 滤镜
|
|
|
+ publishEditNewVideoSetView.filterButton.rx.tap.subscribe(onNext: {[weak self] (data) in
|
|
|
+ guard let strongSelf = self else { return }
|
|
|
+ strongSelf.showHiddenSegmentedView(isHidden: true)
|
|
|
+ strongSelf.effectFilterViewisHidden(isHidden: false)
|
|
|
+ }).disposed(by: disposeBag)
|
|
|
+
|
|
|
// 调速view
|
|
|
publishEditNewVideoSetView.speedRegulationButton.rx.tap.subscribe(onNext: { [weak self] (_) in
|
|
|
guard let strongSelf = self else { return }
|
|
|
- if strongSelf.publishEditNewVideoSetView.segmentedView.alpha == 0 {
|
|
|
+ if strongSelf.segmentedView.alpha == 0 {
|
|
|
strongSelf.showHiddenSegmentedView(isHidden: false)
|
|
|
- } else if strongSelf.publishEditNewVideoSetView.segmentedView.alpha == 1 {
|
|
|
+ } else if strongSelf.segmentedView.alpha == 1 {
|
|
|
strongSelf.showHiddenSegmentedView(isHidden: true)
|
|
|
}
|
|
|
|
|
|
}).disposed(by: disposeBag)
|
|
|
|
|
|
- //调速
|
|
|
- publishEditNewVideoSetView.speedClosure = {
|
|
|
- [weak self] index in
|
|
|
- guard let strongSelf = self else { return }
|
|
|
- strongSelf.speedPlaybackMultiple(index: index)
|
|
|
- }
|
|
|
-
|
|
|
// 播放/暂停
|
|
|
publishEditNewVideoSetView.playProgressView.playButton.rx.tap.subscribe(onNext: { [weak self] (_) in
|
|
|
guard let strongSelf = self else { return }
|
|
@@ -114,24 +136,62 @@ class PublishEditNewVideoView: UIView {
|
|
|
}
|
|
|
|
|
|
// 点击手势
|
|
|
+ publishEditNewVideoSetView.tapClosure = {
|
|
|
+ [weak self] in
|
|
|
+ guard let strongSelf = self else { return }
|
|
|
+ // 隐藏调速
|
|
|
+ if strongSelf.segmentedView.alpha == 1 {
|
|
|
+ strongSelf.showHiddenSegmentedView(isHidden: true)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 左滑 滤镜 加 1
|
|
|
+ publishEditNewVideoSetView.leftSwipeClosure = {
|
|
|
+ [weak self] in
|
|
|
+ self?.filterPlus()
|
|
|
+ }
|
|
|
+ // 右滑 滤镜 减 1
|
|
|
+ publishEditNewVideoSetView.rightSwipeClosure = {
|
|
|
+ [weak self] in
|
|
|
+ self?.filterLess()
|
|
|
+ }
|
|
|
+
|
|
|
editorPreview.tapClosure = {
|
|
|
[weak self] in
|
|
|
guard let strongSelf = self else { return }
|
|
|
-// if strongSelf.effectFilterBeautyView.alpha == 1 {
|
|
|
-// // 隐藏滤镜
|
|
|
-// strongSelf.effectFilterBeautyViewisHidden(isHidden: true)
|
|
|
-// }
|
|
|
+ if strongSelf.effectFilterView.alpha == 1 {
|
|
|
+ // 隐藏滤镜
|
|
|
+ strongSelf.effectFilterViewisHidden(isHidden: true)
|
|
|
+ }
|
|
|
//
|
|
|
// if strongSelf.musicView.alpha == 1 {
|
|
|
// // 隐藏音乐
|
|
|
// strongSelf.musicViewisHidden(isHidden: true)
|
|
|
// }
|
|
|
- // 隐藏调速
|
|
|
- if strongSelf.publishEditNewVideoSetView.segmentedView.alpha == 1 {
|
|
|
- strongSelf.showHiddenSegmentedView(isHidden: true)
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
+ // 左滑 滤镜 加 1
|
|
|
+ editorPreview.leftSwipeClosure = {
|
|
|
+ [weak self] in
|
|
|
+ self?.filterPlus()
|
|
|
+ }
|
|
|
+ // 右滑 滤镜 减 1
|
|
|
+ editorPreview.rightSwipeClosure = {
|
|
|
+ [weak self] in
|
|
|
+ self?.filterLess()
|
|
|
+ }
|
|
|
+ // 滤镜设置
|
|
|
+ effectFilterView.effectFilterView.didSelectCloSure = {
|
|
|
+ [weak self] (index, aliyunEffectFilter) in
|
|
|
+ self?.selectedIndex = index
|
|
|
+ if index == 0 {
|
|
|
+ self?.editor?.removeFilter()
|
|
|
+ }else {
|
|
|
+ self?.editor?.apply(aliyunEffectFilter)
|
|
|
+ }
|
|
|
+ self?.showFilterNameLabel(aliyunEffectFilter: aliyunEffectFilter)
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/// 编辑
|
|
@@ -175,6 +235,57 @@ class PublishEditNewVideoView: UIView {
|
|
|
return publishEditNewVideoSetView
|
|
|
}()
|
|
|
|
|
|
+ /// 滤镜跟美颜
|
|
|
+ lazy var effectFilterView: PublishEditNewEffectFilterView = {
|
|
|
+ let effectFilterView = PublishEditNewEffectFilterView(frame: CGRect(x: 0, y: kScreenHeight, width: kScreenWidth, height: 125 + kSafeTabBarHeight))
|
|
|
+ return effectFilterView
|
|
|
+ }()
|
|
|
+
|
|
|
+ //1.初始化JXSegmentedViewx
|
|
|
+ lazy var segmentedView: JXSegmentedView = {
|
|
|
+ let segmentedView = JXSegmentedView()
|
|
|
+ segmentedView.backgroundColor = k000000Color.withAlphaComponent(0.3)
|
|
|
+ segmentedView.delegate = self
|
|
|
+ segmentedView.dataSource = segmentedDataSource
|
|
|
+ segmentedView.indicators = [indicator]
|
|
|
+ segmentedView.selectItemAt(index: 2)
|
|
|
+ segmentedView.defaultSelectedIndex = 2
|
|
|
+ segmentedView.cornerRadius = 20
|
|
|
+ segmentedView.masksToBounds = true
|
|
|
+ segmentedView.alpha = 0
|
|
|
+ segmentedView.isUserInteractionEnabled = true
|
|
|
+ return segmentedView
|
|
|
+ }()
|
|
|
+
|
|
|
+ //2.初始化dataSource
|
|
|
+ private lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
|
|
|
+ let segmentedDataSource = JXSegmentedTitleDataSource()
|
|
|
+ segmentedDataSource.titles = ["极慢","慢","标准","快","极快"]
|
|
|
+ segmentedDataSource.isTitleColorGradientEnabled = true
|
|
|
+ segmentedDataSource.isItemSpacingAverageEnabled = true
|
|
|
+ segmentedDataSource.isTitleZoomEnabled = true
|
|
|
+ segmentedDataSource.titleNormalColor = kffffffColor
|
|
|
+ segmentedDataSource.titleSelectedColor = k333333Color
|
|
|
+ segmentedDataSource.titleNormalFont = kRegularFont14!
|
|
|
+ segmentedDataSource.titleSelectedFont = kRegularFont14
|
|
|
+ segmentedDataSource.isTitleStrokeWidthEnabled = false
|
|
|
+ segmentedDataSource.isTitleMaskEnabled = true
|
|
|
+ segmentedDataSource.itemSpacing = 0
|
|
|
+ segmentedDataSource.itemContentWidth = (kScreenWidth-28)/5
|
|
|
+ //reloadData(selectedIndex:)方法一定要调用,方法内部会刷新数据源数组
|
|
|
+ segmentedDataSource.reloadData(selectedIndex: 2)
|
|
|
+ return segmentedDataSource
|
|
|
+ }()
|
|
|
+
|
|
|
+ //3.初始化指示器indicator
|
|
|
+ private lazy var indicator: JXSegmentedIndicatorBackgroundView = {
|
|
|
+ let indicator = JXSegmentedIndicatorBackgroundView()
|
|
|
+ indicator.indicatorColor = .white
|
|
|
+ indicator.indicatorHeight = 40
|
|
|
+ indicator.backgroundWidthIncrement = 0
|
|
|
+ return indicator
|
|
|
+ }()
|
|
|
+
|
|
|
}
|
|
|
|
|
|
extension PublishEditNewVideoView {
|
|
@@ -235,7 +346,6 @@ extension PublishEditNewVideoView {
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// 显示/隐层 SegmentedView
|
|
|
func showHiddenSegmentedView(isHidden:Bool) {
|
|
|
if isHidden {
|
|
@@ -247,20 +357,95 @@ extension PublishEditNewVideoView {
|
|
|
[weak self] in
|
|
|
guard let strongSelf = self else { return }
|
|
|
if isHidden {
|
|
|
- strongSelf.publishEditNewVideoSetView.segmentedView.alpha = 0
|
|
|
+ strongSelf.segmentedView.alpha = 0
|
|
|
}else {
|
|
|
- strongSelf.publishEditNewVideoSetView.segmentedView.alpha = 1
|
|
|
+ strongSelf.segmentedView.alpha = 1
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /// 滤镜是否显示
|
|
|
+ ///
|
|
|
+ /// - Parameter isHidden: 是否隐藏
|
|
|
+ func effectFilterViewisHidden(isHidden:Bool) {
|
|
|
+ var offsetY : CGFloat = kScreenHeight
|
|
|
+ if isHidden {
|
|
|
+ offsetY = kScreenHeight
|
|
|
+ // 移除点击手势
|
|
|
+ editorPreview.removetap()
|
|
|
+ }else {
|
|
|
+ offsetY = kScreenHeight-(125 + kSafeTabBarHeight)
|
|
|
+ // 添加点击手势
|
|
|
+ editorPreview.addTap()
|
|
|
+ }
|
|
|
+ UIView.animate(withDuration: 0.5) {
|
|
|
+ [weak self] in
|
|
|
+ self?.effectFilterView.frame = CGRect(x: 0, y: offsetY, width: kScreenWidth, height: 125 +
|
|
|
+ kSafeTabBarHeight)
|
|
|
+ if isHidden {
|
|
|
+ self?.effectFilterView.alpha = 0
|
|
|
+ self?.publishEditNewVideoSetView.alpha = 1
|
|
|
+ }else {
|
|
|
+ self?.effectFilterView.alpha = 1
|
|
|
+ self?.publishEditNewVideoSetView.alpha = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //滤镜 减 1
|
|
|
+ func filterLess() {
|
|
|
+ if selectedIndex > 0 {
|
|
|
+ selectedIndex = selectedIndex - 1
|
|
|
+ }else {
|
|
|
+ selectedIndex = (aliyunFiltersModel?.filters?.count ?? 1) - 1
|
|
|
+ }
|
|
|
+ //选中滤镜
|
|
|
+ didSelectFilter()
|
|
|
+ }
|
|
|
+
|
|
|
+ //滤镜 加 1
|
|
|
+ func filterPlus() {
|
|
|
+ if selectedIndex < ((aliyunFiltersModel?.filters?.count ?? 0) - 1) {
|
|
|
+ selectedIndex = selectedIndex + 1
|
|
|
+ }else {
|
|
|
+ selectedIndex = 0
|
|
|
+ }
|
|
|
+ //选中滤镜
|
|
|
+ didSelectFilter()
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 选中滤镜
|
|
|
+ func didSelectFilter() {
|
|
|
+ let indexPath = IndexPath(row: self.selectedIndex , section: 0)
|
|
|
+ effectFilterView.effectFilterView.collectionView(effectFilterView.effectFilterView.collectionView, didSelectItemAt: indexPath)
|
|
|
+ effectFilterView.effectFilterView.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: UICollectionView.ScrollPosition.centeredHorizontally)
|
|
|
+ }
|
|
|
+ /// 滤镜名字显示
|
|
|
+ ///
|
|
|
+ /// - Parameter aliyunEffectFilter: 滤镜模型
|
|
|
+ func showFilterNameLabel(aliyunEffectFilter:AliyunEffectFilter) {
|
|
|
+
|
|
|
+ editorPreview.filterNameLabel.alpha = 1
|
|
|
+ editorPreview.filterNameLabel.text = aliyunEffectFilter.name
|
|
|
+ UIView.animate(withDuration: 2, animations: {
|
|
|
+ [weak self] in
|
|
|
+ self?.editorPreview.filterNameLabel.alpha = 1
|
|
|
+ }, completion: {
|
|
|
+ [weak self] (finished) in
|
|
|
+ UIView.animate(withDuration: 2, animations: {
|
|
|
+ [weak self] in
|
|
|
+ self?.editorPreview.filterNameLabel.alpha = 0
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
|
extension PublishEditNewVideoView : AliyunIPlayerCallback {
|
|
|
|
|
|
-
|
|
|
/// 播放结束
|
|
|
func playerDidEnd() {
|
|
|
publishEditNewVideoSetView.playProgressView.slider.value = Float(0)
|
|
@@ -319,3 +504,30 @@ extension PublishEditNewVideoView : AliyunIExporterCallback {
|
|
|
extension PublishEditNewVideoView : AliyunIRenderCallback {
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+extension PublishEditNewVideoView : JXSegmentedViewDelegate {
|
|
|
+
|
|
|
+ //点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,而不关心具体是点击还是滚动选中的情况。
|
|
|
+ func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
|
|
|
+ speedPlaybackMultiple(index: index)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 点击选中的情况才会调用该方法
|
|
|
+ func segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {
|
|
|
+ //传递didClickSelectedItemAt事件给listContainerView,必须调用!!!
|
|
|
+ }
|
|
|
+
|
|
|
+ // 滚动选中的情况才会调用该方法(未支持滚动选中)
|
|
|
+ func segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) {
|
|
|
+ print("\n------滚动选中\(index)")
|
|
|
+ }
|
|
|
+
|
|
|
+ // 正在滚动中的回调
|
|
|
+ func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 是否允许点击选中目标index的item
|
|
|
+ func segmentedView(_ segmentedView: JXSegmentedView, canClickItemAt index: Int) -> Bool {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+}
|