添加捏合手势
This commit is contained in:
parent
f0528c6e7a
commit
1f1d2282e9
Binary file not shown.
21
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_pauseBtn.imageset/Contents.json
vendored
Normal file
21
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_pauseBtn.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "pause.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_pauseBtn.imageset/pause.png
vendored
Normal file
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_pauseBtn.imageset/pause.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 413 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "play.png",
|
"filename" : "play (1).png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
|
|||||||
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/play (1).png
vendored
Normal file
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_playBtn.imageset/play (1).png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 560 B |
Binary file not shown.
|
Before Width: | Height: | Size: 3.0 KiB |
@ -37,40 +37,47 @@ class ZZHCustomPlayer: UIView {
|
|||||||
|
|
||||||
var playerIsSeeking:Bool = false//标记播放器是否正在拖动
|
var playerIsSeeking:Bool = false//标记播放器是否正在拖动
|
||||||
|
|
||||||
|
//操作maskview的相关配套属性
|
||||||
|
var timerForMaskView:Timer?//标记隐藏倒计时
|
||||||
|
var temScale:CGFloat = 1.0
|
||||||
|
var currentScale:CGFloat = 1.0//当前缩放值
|
||||||
|
|
||||||
//ui
|
//ui
|
||||||
var playerLayerBgView:UIView?
|
var playerLayerBgView:UIView?
|
||||||
var avPlayer:AVPlayer?
|
var avPlayer:AVPlayer?
|
||||||
var avPlayerLayer:AVPlayerLayer?
|
var avPlayerLayer:AVPlayerLayer?
|
||||||
var timeSlider:ZZHCustomSlider?
|
var timeSlider:ZZHCustomSlider?
|
||||||
var prePlayingState:Bool = true //标记 在滑块拖动前,player的播放状态,以便在拖动完毕之后回复播放状态
|
var prePlayingState:Bool = true {//标记 在滑块拖动前,player的播放状态,以便在拖动完毕之后回复播放状态
|
||||||
|
didSet {
|
||||||
|
if(prePlayingState){
|
||||||
|
playBtn.setImage(UIImage(named: "custom_pauseBtn"), for: .normal)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
playBtn.setImage(UIImage(named: "custom_playBtn"), for: .normal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
let playerPauseBgColor:UIColor = UIColor(r: 20, g: 20, b: 20, a: 0.2)//暂停时的背景颜色
|
let playerPauseBgColor:UIColor = UIColor(r: 20, g: 20, b: 20, a: 0.2)//暂停时的背景颜色
|
||||||
|
|
||||||
|
|
||||||
lazy var maskPlayerView:UIView? = {//播放按钮 背景
|
lazy var maskPlayerView:UIView? = {//播放按钮 背景
|
||||||
let bgView = UIView()
|
let bgView = UIView()
|
||||||
|
bgView.isHidden = true
|
||||||
bgView.backgroundColor = playerPauseBgColor
|
bgView.backgroundColor = playerPauseBgColor
|
||||||
|
bgView.addSubview(self.playBtn)
|
||||||
|
|
||||||
bgView.addSubview(self.playStateImgView)
|
self.playBtn.snp.makeConstraints { make in
|
||||||
|
|
||||||
self.playStateImgView.snp.makeConstraints { make in
|
|
||||||
make.centerX.centerY.equalToSuperview()
|
make.centerX.centerY.equalToSuperview()
|
||||||
make.width.height.equalTo(80)
|
make.width.height.equalTo(80)
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
return bgView
|
||||||
}()
|
}()
|
||||||
|
|
||||||
lazy var playStateImgView:UIImageView = {
|
lazy var playBtn:UIButton = {
|
||||||
let imgView = UIImageView()
|
let btn = UIButton()
|
||||||
imgView.image = UIImage(named: "custom_playBtn")
|
btn.addTarget(self, action: #selector(playOrPause(sender: )), for: .touchUpInside)
|
||||||
return imgView
|
btn.setImage(UIImage(named: "custom_playBtn"), for: .normal)
|
||||||
|
return btn
|
||||||
}()
|
}()
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
@ -109,9 +116,18 @@ class ZZHCustomPlayer: UIView {
|
|||||||
playerLayerBgView!.layer.addSublayer(avPlayerLayer!)
|
playerLayerBgView!.layer.addSublayer(avPlayerLayer!)
|
||||||
playerLayerBgView?.backgroundColor = UIColor.clear
|
playerLayerBgView?.backgroundColor = UIColor.clear
|
||||||
|
|
||||||
self.maskPlayerView?.frame = avPlayerLayer!.frame
|
//添加遮罩视图
|
||||||
playerLayerBgView?.addSubview(maskPlayerView!)
|
let mpBgView = UIView(frame: avPlayerLayer!.frame)
|
||||||
|
playerLayerBgView?.addSubview(mpBgView)
|
||||||
|
|
||||||
|
self.maskPlayerView?.frame = mpBgView.bounds
|
||||||
|
mpBgView.addSubview(maskPlayerView!)
|
||||||
|
|
||||||
|
let tgr = UITapGestureRecognizer(target: self, action: #selector(tapPlayerMaskView(sender: )))
|
||||||
|
mpBgView.addGestureRecognizer(tgr)
|
||||||
|
|
||||||
|
let pgr = UIPinchGestureRecognizer(target: self, action: #selector(panPlayerMaskView(sender: )))
|
||||||
|
mpBgView.addGestureRecognizer(pgr)
|
||||||
|
|
||||||
|
|
||||||
timeSlider = ZZHCustomSlider(frame: .zero)
|
timeSlider = ZZHCustomSlider(frame: .zero)
|
||||||
@ -197,6 +213,8 @@ class ZZHCustomPlayer: UIView {
|
|||||||
print("暂停...")
|
print("暂停...")
|
||||||
play(false)
|
play(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iniTimerForMaskView()
|
||||||
}
|
}
|
||||||
|
|
||||||
//内、外部共同使用该play接口
|
//内、外部共同使用该play接口
|
||||||
@ -210,15 +228,57 @@ class ZZHCustomPlayer: UIView {
|
|||||||
self.avPlayer?.pause()
|
self.avPlayer?.pause()
|
||||||
}
|
}
|
||||||
|
|
||||||
updatePlayMaskView(value)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//根据状态更新播放器遮罩视图显示与隐藏
|
//根据状态更新播放器遮罩视图显示与隐藏
|
||||||
func updatePlayMaskView(_ value:Bool) {
|
func updatePlayMaskView(_ value:Bool) {
|
||||||
playStateImgView.isHidden = value
|
maskPlayerView?.isHidden = value
|
||||||
self.maskPlayerView?.backgroundColor = value ? .clear : playerPauseBgColor
|
if value == false {
|
||||||
|
iniTimerForMaskView()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
resetTimerForMaskView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func iniTimerForMaskView() {
|
||||||
|
resetTimerForMaskView()
|
||||||
|
timerForMaskView = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(hidenMaskViewTimerAction(sender: )), userInfo: nil, repeats: false)
|
||||||
|
RunLoop.main.add(timerForMaskView!, forMode: .common)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func resetTimerForMaskView() {
|
||||||
|
if let td = timerForMaskView {
|
||||||
|
td.invalidate()
|
||||||
|
timerForMaskView = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func hidenMaskViewTimerAction(sender:CADisplayLink) {
|
||||||
|
maskPlayerView?.isHidden = true
|
||||||
|
resetTimerForMaskView()
|
||||||
|
}
|
||||||
|
|
||||||
|
//点击了player 的maskview
|
||||||
|
@objc func tapPlayerMaskView(sender:UITapGestureRecognizer) {
|
||||||
|
updatePlayMaskView(!(maskPlayerView!.isHidden))
|
||||||
|
}
|
||||||
|
|
||||||
|
//缩放手势 正在player的maskview进行缩放
|
||||||
|
@objc func panPlayerMaskView(sender:UIPinchGestureRecognizer) {
|
||||||
|
|
||||||
|
if sender.state == .began {
|
||||||
|
temScale = 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
currentScale = currentScale - (temScale - sender.scale)
|
||||||
|
currentScale = min(currentScale, 1.5)
|
||||||
|
currentScale = max(currentScale, 0.5)
|
||||||
|
temScale = sender.scale
|
||||||
|
print("\(sender.scale) currentScale....\(currentScale)")
|
||||||
}
|
}
|
||||||
|
|
||||||
//根据播放进度更新slider的 ui
|
//根据播放进度更新slider的 ui
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user