Отключить смахивание, чтобы закрыть на AVPlayerController
iOS 11 представила пролистывание, чтобы закрыть AVPlayerController. У меня есть приложение, которое предназначено для малышей, поэтому экран легко ударить, заставляя видео закрыться. Есть ли вообще убрать жест, чтобы закрыть плеер?
Я попытался добавить переопределение жестов в представление AVPlayerController, но это не работает. Есть возможное решение о том, как я могу добавить Swipe Gesture к AVPlayer в Swift 3, но должен быть более чистый способ
2 ответа
Мне удалось решить вопрос. Как прокомментировал @Vakas, AVPlayerController не должен быть разделен на подклассы. Первоначально я поместил его в подкласс и представил с использованием модального перехода. Это было причиной проблемы.
Чтобы решить эту проблему, я создал еще один контроллер представления, в который встроен AVPlayerController.
import UIKit
import AVKit
class PlayerViewController: UIViewController, AVPlayerViewControllerDelegate {
var videoRecord: Video!
var presentingController = ""
var videos = [Video]()
var presentingPlaylist: Playlist?
let playerViewController = TFLPlayerController()
override func viewDidLoad() {
super.viewDidLoad()
playerViewController.delegate = self
playerViewController.videoRecord = videoRecord
playerViewController.videos = self.videos
playerViewController.allowsPictureInPicturePlayback = false
// Add the original AVPlayerController in here
self.addChildViewController(playerViewController)
let playerView = playerViewController.view
playerView?.frame = self.view.bounds
self.view.addSubview(playerView!)
playerViewController.didMove(toParentViewController: self)
}
}
Я в основном использую этот View Controller для прохождения через свойства, такие как видео и т. Д., К первоначально разделенному на подклассы AVPlayerController.
Если AVPlayerController встроен (не представлен), кнопка "Закрыть" не отображается в представлении элементов управления.
Мое решение - найти подпредставление с помощью распознавателей жестов и удалить средство распознавания жестов панорамирования.
for v in playerViewController.view.subviews {
if v.gestureRecognizers != nil {
for gr in v.gestureRecognizers! {
if gr is UIPanGestureRecognizer {
// remove pan gesture to prevent closing on pan
v.removeGestureRecognizer(gr)
}
}
}
}
Ни один из приведенных выше комментариев не решил проблему (iOS 13+). Решение:
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
avPlayerViewController.view.addGestureRecognizer(panGestureRecognizer)
где handlePanGesture(_:) - это метод, который будет вызываться, если на экране произойдет панорамирование (и видео не будет перемещаться - проблема заключалась в том, что оно было перетащено), а avPlayerViewController - это экземпляр AVPlayerViewController.
Примечание: если вы хотите предотвратить сжатие / поворот и любой другой жест, вы можете добавить для каждого жеста новый пользовательский интерфейс... GestureRecognizer. Просто убедитесь, что весь делегат UI...GestureRecognizers установлен, и эта функция реализована:
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}