Skip to content

zoogo-K/PinchAVPlayerViewController

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 

Repository files navigation

This demo shows you how to add Pinch and Pan gestures to AVPlayerViewController.

RPReplay_Final1706080299.mov

Here is the complete code

import UIKit
import AVKit

class VideoPlayerViewController: AVPlayerViewController {
    
    convenience init(urlString: String) {
        self.init()
        player = AVPlayer(url: URL(string: urlString)!)
        player?.play()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        processSubviews(view)
        
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchGesture(_:)))
        view.viewWithTag(999)?.addGestureRecognizer(pinchGesture)
        
        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
        view.viewWithTag(999)?.addGestureRecognizer(panGesture)
    }
    
    private func processSubviews(_ view: UIView) {
        for subview in view.subviews {
            if NSStringFromClass(type(of: subview)) == "AVPlaybackContentContainerView" {
                subview.tag = 999
            }
            if NSStringFromClass(type(of: subview)) == "__AVPlayerLayerView" {
                subview.tag = 1000
            }
            processSubviews(subview)
        }
    }
    
    @objc private func handlePinchGesture(_ gesture: UIPinchGestureRecognizer) {
        guard let vv = view.viewWithTag(1000) else { return }

        if gesture.state == .began || gesture.state == .changed {
            vv.layer.transform = CATransform3DScale(vv.layer.transform, gesture.scale, gesture.scale, 0)
            gesture.scale = 1
        }
    }

    
    @objc private func handlePanGesture(_ gesture: UIPanGestureRecognizer) {
        let translation = gesture.translation(in: self.view)
        guard let vv = view.viewWithTag(1000) else { return }
        if gesture.state == .began || gesture.state == .changed {
            let newCenter = CGPoint(x: vv.layer.position.x + translation.x, y: vv.layer.position.y + translation.y)
            vv.layer.position = newCenter
            gesture.setTranslation(CGPoint.zero, in: self.view)
        }
    }
}

About

Add Pinch and Pan gestures to AVPlayerViewController

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages