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
}
}