在 AVPlayerController 上禁用滑动关闭
Disable swipe to close on AVPlayerController
iOS 11 引入了滑动关闭 AVPlayerController。我有一个针对幼儿的应用程序,因此很容易滑动屏幕导致视频关闭。有什么办法去掉关闭播放器的手势吗?
我试过向 AVPlayerController 的视图添加手势覆盖,但它不起作用。 上有一个可能的解决方案,但必须有一个更简洁的方法
我设法解决了问题。正如@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)
}
}
}
}
None 上面的评论解决了这个问题(iOS 13+)。解决方案:
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
avPlayerViewController.view.addGestureRecognizer(panGestureRecognizer)
其中 handlePanGesture(_:) 是在屏幕上发生平移时调用的方法(并且视频不会移动 - 这是问题中被拖动的问题),avPlayerViewController 是AVPlayerViewController 实例。
注意:如果你想防止捏/旋转和任何其他手势,你可以为每个手势添加一个新的 UI...GestureRecognizer。只要确保所有 UI...GestureRecognizers 的委托都已设置,并且此功能已实现:
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
iOS 11 引入了滑动关闭 AVPlayerController。我有一个针对幼儿的应用程序,因此很容易滑动屏幕导致视频关闭。有什么办法去掉关闭播放器的手势吗?
我试过向 AVPlayerController 的视图添加手势覆盖,但它不起作用。
我设法解决了问题。正如@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)
}
}
}
}
None 上面的评论解决了这个问题(iOS 13+)。解决方案:
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
avPlayerViewController.view.addGestureRecognizer(panGestureRecognizer)
其中 handlePanGesture(_:) 是在屏幕上发生平移时调用的方法(并且视频不会移动 - 这是问题中被拖动的问题),avPlayerViewController 是AVPlayerViewController 实例。
注意:如果你想防止捏/旋转和任何其他手势,你可以为每个手势添加一个新的 UI...GestureRecognizer。只要确保所有 UI...GestureRecognizers 的委托都已设置,并且此功能已实现:
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}