继续..自定义播放器
This commit is contained in:
parent
c438d862cf
commit
a73cb139a4
Binary file not shown.
@ -32,8 +32,8 @@
|
|||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "576"
|
startingLineNumber = "576"
|
||||||
endingLineNumber = "576"
|
endingLineNumber = "576"
|
||||||
landmarkName = "CCHomeController"
|
landmarkName = "imagePickerController(_:didFinishPickingMediaWithInfo:)"
|
||||||
landmarkType = "21">
|
landmarkType = "7">
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</BreakpointProxy>
|
||||||
<BreakpointProxy
|
<BreakpointProxy
|
||||||
@ -96,7 +96,7 @@
|
|||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "540"
|
startingLineNumber = "540"
|
||||||
endingLineNumber = "540"
|
endingLineNumber = "540"
|
||||||
landmarkName = "gotoVideoTransformVC(url:asset:)"
|
landmarkName = "photoLibrary()"
|
||||||
landmarkType = "7">
|
landmarkType = "7">
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</BreakpointProxy>
|
||||||
|
|||||||
21
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/Contents.json
vendored
Normal file
21
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/Contents.json
vendored
Normal file
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/icon@1x.png
vendored
Normal file
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/icon@1x.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 741 KiB |
@ -13,7 +13,34 @@ class ZZHCustomPlayer: UIView {
|
|||||||
var avPlayer:AVPlayer?
|
var avPlayer:AVPlayer?
|
||||||
var avPlayerLayer:AVPlayerLayer?
|
var avPlayerLayer:AVPlayerLayer?
|
||||||
var timeSlider:ZZHCustomSlider?
|
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) {
|
override init(frame: CGRect) {
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
@ -32,9 +59,14 @@ class ZZHCustomPlayer: UIView {
|
|||||||
playerLayerBgView!.layer.addSublayer(avPlayerLayer!)
|
playerLayerBgView!.layer.addSublayer(avPlayerLayer!)
|
||||||
playerLayerBgView?.backgroundColor = UIColor.orange
|
playerLayerBgView?.backgroundColor = UIColor.orange
|
||||||
|
|
||||||
|
self.maskPlayerView?.frame = avPlayerLayer!.frame
|
||||||
|
playerLayerBgView?.addSubview(maskPlayerView!)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
timeSlider = ZZHCustomSlider(frame: .zero)
|
timeSlider = ZZHCustomSlider(frame: .zero)
|
||||||
timeSlider?.processChangeValueCallback = { value in
|
timeSlider?.processChangeValueCallback = { (value,isMoving) in
|
||||||
print("value:\(value)")
|
print("value:\(value) isMoving:\(isMoving)")
|
||||||
}
|
}
|
||||||
self.addSubview(timeSlider!)
|
self.addSubview(timeSlider!)
|
||||||
timeSlider!.snp.makeConstraints { make in
|
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) {
|
override func draw(_ rect: CGRect) {
|
||||||
super.draw(rect)
|
super.draw(rect)
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
typealias CustomSliderProcessChangeValueCallback = (_ currentValue:Float)->Void
|
typealias CustomSliderProcessChangeValueCallback = (_ currentValue:Float,_ isMoving:Bool)->Void
|
||||||
class ZZHCustomSlider: UIView {
|
class ZZHCustomSlider: UIView {
|
||||||
var sHeight:CGFloat?
|
var sHeight:CGFloat?
|
||||||
var sLabel:UILabel?
|
var sLabel:UILabel?
|
||||||
@ -74,11 +74,13 @@ class ZZHCustomSlider: UIView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//内部拖动更新当前滑块value:0~1
|
//内部拖动更新当前滑块value:0~1
|
||||||
func updateProcessValue(value:Float) {
|
func updateProcessValue(value:Float,isMoving:Bool) {
|
||||||
self.timeSlider!.value = value
|
self.timeSlider!.value = value
|
||||||
guard let processChangeValueCallback else {
|
guard let processChangeValueCallback else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isMoving {
|
||||||
var currentValue = max(0, min(value, 1))
|
var currentValue = max(0, min(value, 1))
|
||||||
//格式化为0.x
|
//格式化为0.x
|
||||||
let formattedValue = String(format: "%.1f", currentValue)
|
let formattedValue = String(format: "%.1f", currentValue)
|
||||||
@ -86,9 +88,14 @@ class ZZHCustomSlider: UIView {
|
|||||||
|
|
||||||
if currentValue > preValue || currentValue < preValue {
|
if currentValue > preValue || currentValue < preValue {
|
||||||
preValue = currentValue
|
preValue = currentValue
|
||||||
processChangeValueCallback(preValue)
|
processChangeValueCallback(preValue,isMoving)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
processChangeValueCallback(preValue,isMoving)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//外部播放时的更新当前滑块
|
//外部播放时的更新当前滑块
|
||||||
func exUpdateProcessValue(value:Float) {
|
func exUpdateProcessValue(value:Float) {
|
||||||
@ -108,7 +115,7 @@ class ZZHCustomSlider: UIView {
|
|||||||
if let th = touch {
|
if let th = touch {
|
||||||
let touchPoint = th.location(in: self.timeSlider!)
|
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
|
timeSlider!.isNormal = true
|
||||||
self.updateSliderHeight(height: (self.sHeight)!)
|
self.updateSliderHeight(height: (self.sHeight)!)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateProcessValue(value: preValue,isMoving: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
|
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||||
@ -125,6 +134,7 @@ class ZZHCustomSlider: UIView {
|
|||||||
timeSlider!.isNormal = true
|
timeSlider!.isNormal = true
|
||||||
self.updateSliderHeight(height: (self.sHeight)!)
|
self.updateSliderHeight(height: (self.sHeight)!)
|
||||||
}
|
}
|
||||||
|
updateProcessValue(value: preValue,isMoving: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user