Scrollview с некоторыми видео в цикле воспроизведения

Я пытаюсь сделать горизонтальный просмотр UIScrollview с несколькими видео, которые воспроизводятся в цикле, и я не могу заставить его работать. Моя проблема - это часть цикла, поскольку я пытался использовать NSNotification.Name.AVPlayerItemDidPlayToEndTime и NSNotification.Name.AVPlayerItemFailedToPlayToEndTime, но уведомления перекрываются, и приложение вылетает. После дальнейших исследований я обнаружил, что могу использовать новый AVPlayerLooper, но ни один из них я не знаю, как правильно реализовать...

Текущий AVPlayer View подкласс:

class PlayerView: UIView {

override class var layerClass: AnyClass {
    return AVPlayerLayer.self
}

var player: AVPlayer? {
    get {
        return playerLayer.player
    }

    set {
        playerLayer.player = newValue
    }
}

var playerLayer: AVPlayerLayer {
    return layer as! AVPlayerLayer
}

override init(frame: CGRect) {
    super.init(frame: frame)
    playerLayer.videoGravity = .resizeAspectFill
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    playerLayer.videoGravity = .resizeAspectFill
}
}

Мой ViewController:

class ViewController: UIViewController, UIScrollViewDelegate {
    let videolist = ["Tutorial animation 1 iPhone 6+ - 7+", "Tutorial animation 2 iPhone 6+ - 7+", "Tutorial animation 3 iPhone 6+ - 7+", "Tutorial animation 4 iPhone 6+ - 7+", "Tutorial animation 5 iPhone 6+ - 7+", "Tutorial animation 6 iPhone 6+ - 7+"]

    let scrollView = UIScrollView(frame: CGRect(x:0, y:0, width:320,height: 300))
    var pageControl : UIPageControl = UIPageControl(frame:CGRect(x: 50, y: 300, width: 200, height: 50))

    var yPosition:CGFloat = 0
    var scrollViewContentSize:CGFloat=0;
    var vArray = [VideoPlayer]()
    override func viewDidLoad() {
        super.viewDidLoad()

        configurePageControl()

        scrollView.delegate = self
        self.view.addSubview(scrollView)
        for  i in stride(from: 0, to: videolist.count, by: 1) {
            var frame = CGRect.zero
            frame.origin.x = self.scrollView.frame.size.width * CGFloat(i)
            frame.origin.y = 0
            frame.size = self.scrollView.frame.size
            self.scrollView.isPagingEnabled = true
            let playerView = PlayerView()
            playerView.frame = frame
            playerView.tag = i
            print(videolist[i])
            scrollView.addSubview(playerView)

            if let filePath = Bundle.main.path(forResource: self.videolist[i], ofType: "mp4") {
                let fileURL = NSURL(fileURLWithPath: filePath)
                let player = AVPlayer(url: fileURL as URL)
                playerView.player = player
                player.play()

            }

        }

        self.scrollView.setNeedsDisplay()

        self.scrollView.contentSize = CGSize(width: self.scrollView.frame.size.width * CGFloat(videolist.count), height: self.scrollView.frame.size.height)
        pageControl.addTarget(self, action: Selector(("changePage:")), for: UIControlEvents.valueChanged)
    }
    func configurePageControl() {
        // The total number of pages that are available is based on how many available colors we have.
        self.pageControl.numberOfPages = videolist.count
        self.pageControl.currentPage = 0
        self.pageControl.tintColor = UIColor.red
        self.pageControl.pageIndicatorTintColor = UIColor.black
        self.pageControl.currentPageIndicatorTintColor = UIColor.green
        self.view.addSubview(pageControl)

    }

    // MARK : TO CHANGE WHILE CLICKING ON PAGE CONTROL
    func changePage(sender: AnyObject) -> () {
        let x = CGFloat(pageControl.currentPage) * scrollView.frame.size.width
        scrollView.setContentOffset(CGPoint(x: x,y :0), animated: true)
    }

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
            let i = Int(pageNumber)
            pageControl.currentPage = i
}

}

0 ответов

Другие вопросы по тегам