0

我一直在使用下面的代码片段来实现只在一半屏幕上呈现视图控制器的效果:

func showPlayerView() {
    let controller = storyboard!.instantiateViewController(withIdentifier: "playerViewController") as! PlayerViewController
    controller.player = self.player
    controller.providesPresentationContextTransitionStyle = true
    controller.definesPresentationContext = true
    controller.transitioningDelegate = self
    
    self.present(controller, animated: true, completion: nil)
}

extension ViewController : UIViewControllerTransitioningDelegate
{
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
        if presented is PlayerViewController {
            return HalfSizePresentationController(presentedViewController: presented, presenting: presenting)
        }
        return nil
    }
    
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return animator
    }
    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return animator
    }
}

class HalfSizePresentationController : UIPresentationController {
    override var frameOfPresentedViewInContainerView: CGRect
    {
        get {
            let height: CGFloat = 200
            return CGRect(x: 0, y: UIScreen.main.bounds.height - height, width: UIScreen.main.bounds.width, height: 200)
        }
    }
}

这曾经在 tvOS 13 上工作,但现在从 tvOS 14 开始,我得到的是: 糟糕的动画

知道如何在 iOS 14 上实现这一点吗?

4

1 回答 1

0

显然问题在于 tvOS 11 将默认过渡样式设置为与以前不同的样式。

我可以通过添加以下行来解决此问题:

controller.modalPresentationStyle = .custom

就在打电话之前self.present(controller, animated: true, completion: nil)

但是,这引入了一个新问题,导致原始 ViewController 在动画结束后消失,如此处所述:Prested view controller 在使用自定义 UIViewController 动画的动画后消失

最后通过在 my 中添加以下几行来解决它UIPresentationController

override func dismissalTransitionDidEnd(_ completed: Bool) {
    if let window = UIApplication.shared.keyWindow {
        if let viewController = window.rootViewController {
            window.addSubview(viewController.view)
        }
    }
}
于 2020-11-18T17:44:15.607 回答