Отключить смахивание, чтобы закрыть на 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
}
Другие вопросы по тегам