我正在使用youtube app中的可拖动视频播放器。我已经能够轻扫工作,并且我将视频播放器视图作为子视图添加到Tab栏控制器,这是我的应用程序的根视图。问题是,当我向下滑动以最小化视频时,我无法在视频播放器下方选择两个标签栏项目。我该如何解决这个问题?
在图像中,除非我从屏幕上移除视频播放器,否则不能选择Live和Me选项卡。
我的视图层次结构是UITabBarController> UINavigationController> UIViewController所以我将UINavigationController子类化:
class CFNavigationController: UINavigationController, CFVideoPlayerControllerDelegate {
//MARK: Properties
lazy var videoPlayerViewController: CFVideoPlayerController = {
let pvc: CFVideoPlayerController = self.storyboard?.instantiateViewController(withIdentifier: "videoPlayer") as! CFVideoPlayerController
pvc.view.frame = CGRect.init(origin: self.hiddenOrigin, size: UIScreen.main.bounds.size)
pvc.delegate = self
return pvc
}()
let statusView: UIView = {
let st = UIView.init(frame: UIApplication.shared.statusBarFrame)
st.backgroundColor = UIColor.white
st.alpha = 0.15 // 0.15
return st
}()
let hiddenOrigin: CGPoint = {
let y = UIScreen.main.bounds.height - (UIScreen.main.bounds.width * 9 / 32) - 10
let x = -UIScreen.main.bounds.width
let coordinate = CGPoint.init(x: x, y: y)
return coordinate
}()
let minimizedOrigin: CGPoint = {
let x = UIScreen.main.bounds.width/2 - 10
let y = UIScreen.main.bounds.height - (UIScreen.main.bounds.width * 9 / 32) - 60
let coordinate = CGPoint.init(x: x, y: y)
return coordinate
}()
let fullScreenOrigin = CGPoint.init(x: 0, y: 0)
//Methods
func animatePlayView(toState: stateOfVC) {
switch toState {
case .fullScreen:
UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 5, options: UIViewAnimationOptions.beginFromCurrentState, animations: {
self.videoPlayerViewController.view.frame.origin = self.fullScreenOrigin
})
case .minimized:
UIView.animate(withDuration: 0.3, animations: {
self.videoPlayerViewController.view.frame.origin = self.minimizedOrigin
})
case .hidden:
UIView.animate(withDuration: 0.3, animations: {
self.videoPlayerViewController.view.frame.origin = self.hiddenOrigin
self.videoPlayerViewController.videoPlayerView.player?.replaceCurrentItem(with: nil)
})
}
}
func positionDuringSwipe(scaleFactor: CGFloat) -> CGPoint {
let width = UIScreen.main.bounds.width * 0.5 * scaleFactor
let height = width * 9 / 16
let x = (UIScreen.main.bounds.width - 10) * scaleFactor - width
let y = (UIScreen.main.bounds.height - 10 ) * scaleFactor - height
let coordinate = CGPoint.init(x: x, y: y)
return coordinate
}
//MARK: Delegate methods
func didMinimize() {
self.animatePlayView(toState: .minimized)
}
func didMaximize(){
self.animatePlayView(toState: .fullScreen)
}
func didEndedSwipe(toState: stateOfVC){
self.animatePlayView(toState: toState)
}
func swipeToMinimize(translation: CGFloat, toState: stateOfVC){
switch toState {
case .fullScreen:
self.videoPlayerViewController.view.frame.origin = self.positionDuringSwipe(scaleFactor: translation)
case .hidden:
// self.videoPlayerViewController.view.frame.origin.x = UIScreen.main.bounds.width/2 - abs(translation) - 10
self.videoPlayerViewController.removeFromParentViewController()
case .minimized:
self.videoPlayerViewController.view.frame.origin = self.positionDuringSwipe(scaleFactor: translation)
}
}
//MARK: ViewController lifecycle
override func viewDidLoad() {
super.viewDidLoad()
self.tabBarController?.view.addSubview(self.videoPlayerViewController.view)
self.tabBarController?.view.bringSubview(toFront: self.videoPlayerViewController.view)
}
override func viewDidAppear(_ animated: Bool) {
super.viewWillAppear(true)
}
// Give View Controllers the power of their own rotation
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return visibleViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations
}
open override var shouldAutorotate: Bool {
return visibleViewController?.shouldAutorotate ?? super.shouldAutorotate
} }
以下是我将其添加到子视图的方式:
self.tabBarController?.view.addSubview(self.videoPlayerViewController.view)
self.tabBarController?.view.bringSubview(toFront: self.videoPlayerViewController.view)