TabBarController的子视图阻止了iOS

时间:2017-02-05 23:14:08

标签: ios

我正在使用youtube app中的可拖动视频播放器。我已经能够轻扫工作,并且我将视频播放器视图作为子视图添加到Tab栏控制器,这是我的应用程序的根视图。问题是,当我向下滑动以最小化视频时,我无法在视频播放器下方选择两个标签栏项目。我该如何解决这个问题? Screen snippet 在图像中,除非我从屏幕上移除视频播放器,否则不能选择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)

0 个答案:

没有答案