在 iOS 14 上的一半屏幕上呈现 UIViewController

Posted

技术标签:

【中文标题】在 iOS 14 上的一半屏幕上呈现 UIViewController【英文标题】:Presenting UIViewController on half of screen on iOS 14 【发布时间】:2020-11-18 10:17:55 【问题描述】:

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

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 上实现这一点吗?

【问题讨论】:

【参考方案1】:

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

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

controller.modalPresentationStyle = .custom

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

但是,这引入了一个新问题,导致原始 ViewController 在动画结束后消失,如下所述:Presented view controller disappears after animation using custom UIViewController animations

最终通过在我的UIPresentationController 中添加以下几行来解决它:

override func dismissalTransitionDidEnd(_ completed: Bool) 
    if let window = UIApplication.shared.keyWindow 
        if let viewController = window.rootViewController 
            window.addSubview(viewController.view)
        
    

【讨论】:

以上是关于在 iOS 14 上的一半屏幕上呈现 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14 从 UIView 呈现 UIMenu

如何获得屏幕上 UIview 的百分比

获取与屏幕大小 iOS 相关的 UIView 原点

IOS/Objective-C:检测 UIVIew 上的滑动和屏幕相同位置的按钮触摸

在iOS上的应用程序中截取屏幕截图的方法是什么?

iOS 15 中的状态栏样式不变