5

いくつかのネットワーク操作を実行する際に、ユーザインタラクションを防ぎ、進行状況を示すモーダルビューコントローラ(MBProgressHUDに似ていますが、ビューコントローラ)を提示します。UIAlertControllerのようなステータスバーの色を変更せずにビューコントローラを表示する

ビューコントローラにはmodalPresentationStyle = .Customがあり、移行するデリゲートとカスタムプレゼンテーションコントローラを使用してアニメーション化されます。トランジションをアニメーション化する以外に、プレゼンテーションを駆動するカスタムアクションはありません。

問題は、ビューコントローラが表示されるたびにステータスバーの色が黒に変わることです。 preferredStatusBarStyleをオーバーライドして常に.LightContentを返すことができますが、このビューコントローラはビ​​ューコントローラの上に表示され、.Defaultと表示されることがあります。基本的には、私はUIAlertControllerと同じ振る舞いをしたい。

Screenshot showing presented view controller causing dark status bar content

私は、ステータスバースペースの外に提示ビューコントローラを移動するには、プレゼンテーションコントローラを設定しようとしている:

private class SEUIProgressControllerPresentationController: UIPresentationController { 

    override func shouldPresentInFullscreen() -> Bool { 
     return false 
    } 

    private override func frameOfPresentedViewInContainerView() -> CGRect { 
     return super.frameOfPresentedViewInContainerView().insetBy(dx: 40, dy: 100) 
    } 

    ... 
} 

これらの設定が提示コントローラの上部を移動行いますステータスバーからは消えますが、ステータスバーはまだ影響を受けます。 View Controllerがステータスバーのスタイルを更新するのを止めるプロパティがありますか?

答えて

3

更新

それは提示ビューコントローラがmodalPresentationCapturesStatusBarAppearance == trueを持っているか、のいずれかを使用するか、これはiOSの10で修正されているように、デフォルトの動作がない限り提示ビューコントローラからステータスバーのルールを無視することで見えますステータスバーの領域に拡張された複数の組み込みプレゼンテーションコントローラ(.customではなく)。

基本的に、カスタムの動作は強制的なオプトインではなくデフォルトのオプトアウトに変更されています。

のiOS 9.xのために

と下

ずっと掘削した後、アプリケーションのステータスバーの色を設定するための内部ロジックは次のようになります。

var viewController = window.rootViewController! 

while let presentedViewController = viewController.valueForKey("_presentedStatusBarViewController") as? UIViewController { 
    viewController = presentedViewController 
} 

while let childViewController = viewController.childViewControllerForStatusBarStyle() { 
    viewController = childViewController 
} 

let style = viewController.preferredStatusBarStyle() 

View Controllerのプロパティ_presentedStatusBarViewControllerが割り当てられていますプレゼンテーションコントローラのプライベートメソッド_shouldChangeStatusBarViewController()の値に基づいてプレゼンテーション中にこのメソッドのデフォルトの実装では、trueを返します。​​と、他のプレゼンテーションコントローラのほんの一部がfalseを返します。そのステータスバーを変更しないための最も直接的な方法を意味

は私のプレゼンテーションコントローラにこのメソッドを追加するだけです:

private class SEUIProgressControllerPresentationController: UIPresentationController { 

    @objc func _shouldChangeStatusBarViewController() -> Bool { 
     return false 
    } 

    ... 
} 

残念ながら、これはApp Storeの審査に合格しません。

public class SEUIProgressController: UIViewController { 

    ... 
    public override func preferredStatusBarStyle() -> UIStatusBarStyle { 

     guard var targetViewController = presentingViewController else { 
      return .LightContent 
     } 

     while let parentViewController = targetViewController.parentViewController { 
      targetViewController = parentViewController 
     } 

     while let childViewController = targetViewController.childViewControllerForStatusBarStyle() { 
      targetViewController = childViewController 
     } 

     return targetViewController.preferredStatusBarStyle() 
    } 

    public override func prefersStatusBarHidden() -> Bool { 

     guard var targetViewController = presentingViewController else { 
      return false 
     } 

     while let parentViewController = targetViewController.parentViewController { 
      targetViewController = parentViewController 
     } 

     while let childViewController = targetViewController.childViewControllerForStatusBarHidden() { 
      targetViewController = childViewController 
     } 

     return targetViewController.prefersStatusBarHidden() 
    } 
} 

代わりに、私がやっていることは、私のビューコントローラに提示ビューコントローラに適用されるロジックを再作成され

関連する問題