UIViewController In-Call状态栏问题

Giz*_*odo 17 statusbar modalviewcontroller ios in-call swift

问题:

在调用状态栏消失后,模态呈现的视图控制器不会向上移动,在顶部留下20px空/透明空间.


正常:没有问题

在此输入图像描述


在电话:没有问题

在此输入图像描述


在呼叫消失后:

在顶部留下20px高的空/透明空间,露出下面的橙色视图.但是,状态栏仍然存在于透明区域上方.导航栏还为状态栏留出空间,它的位置只有20px太低.

在此输入图像描述

在此输入图像描述


  • 基于iOS 10
  • 模态呈现的视图控制器
  • 自定义模态演示
  • 后面的主视图控制器是橙色
  • 不使用Autolayout
  • 当旋转到横向时,20px In-Call Bar离开并仍然留下20px的间隙.
  • 我选择退出在横向方向显示状态栏.(即大多数股票应用程序)

我试着听App代表:

willChangeStatusBarFrame
didChangeStatusBarFrame
Run Code Online (Sandbox Code Playgroud)

还可以查看基于控制器的通知:

UIApplicationWillChangeStatusBarFrame
UIApplicationDidChangeStatusBarFrame
Run Code Online (Sandbox Code Playgroud)

当我为所有上述四种方法记录呈现视图的帧时,帧始终位于(y:0)原点.


更新

查看控制器自定义模式演示

    let storyboard = UIStoryboard(name: "StoryBoard1", bundle: nil)
    self.modalVC = storyboard.instantiateViewController(withIdentifier: "My Modal View Controller") as? MyModalViewController
    self.modalVC!.transitioningDelegate = self
    self.modalVC.modalPresentationStyle = .custom
    self.modalVC.modalPresentationCapturesStatusBarAppearance = true;
    self.present(self.modalVC!, animated: true, completion: nil)


    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let containerView = transitionContext.containerView
        let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
        let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
        toViewController!.view.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)

        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0.0, options: [.curveEaseOut], animations: { () -> Void in

            toViewController!.view.transform = CGAffineTransform.identity

        }, completion: { (completed) -> Void in

           transitionContext.completeTransition(completed)

        })
 }
Run Code Online (Sandbox Code Playgroud)

Jit*_*odi 5

我也遇到了这个问题,但是当我采用这种方法后,问题就消失了。

iOS具有willChangeStatusBarFrame处理状态栏的默认方法。请把这个方法检查一下。

func application(_ application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect) {
    UIView.animate(withDuration: 0.35, animations: {() -> Void in
        let windowFrame: CGRect? = ((window?.rootViewController? as? UITabBarController)?.viewControllers[0] as? UINavigationController)?.view?.frame
        if newStatusBarFrame.size.height > 20 {
            windowFrame?.origin?.y = newStatusBarFrame.size.height - 20
            // old status bar frame is 20
        }
        else {
            windowFrame?.origin?.y = 0.0
        }
        ((window?.rootViewController? as? UITabBarController)?.viewControllers[0] as? UINavigationController)?.view?.frame = windowFrame
    })
}
Run Code Online (Sandbox Code Playgroud)

希望这件事对您有帮助。
谢谢


Bws*_*luk 5

我一直在寻找解决方案3天。我不喜欢这种解决方案,但是没有找到更好的解决方法。

当rootViewController视图的高度比窗口的高度高20个点时,我会收到状态栏高度更新的通知时,我手动设置了正确的值。

将方法添加到AppDelegate.swift

func application(_ application: UIApplication, didChangeStatusBarFrame oldStatusBarFrame: CGRect) {
        if let window = application.keyWindow {
            window.rootViewController?.view.frame = window.frame
        }
    }
Run Code Online (Sandbox Code Playgroud)

之后,它会按预期工作(即使方向更改后)。希望它能对某人有所帮助,因为我在此上花费了太多时间。

PS它闪烁一点,但可以。