■はじめに
以下のようにスプラッシュのViewを取得したい場合があります。(たまに)
- スプラッシュ表示後も一定時間スプラッシュを表示したい
- 特定の画面でローディングダイアログなどの代わりにスプラッシュを表示したい(裏で画面遷移するなど)
その場合に、スプラッシュと同じような構成でViewを作成してもいいですが、二度手間になります。
ここでは、簡単にスプラッシュからViewを取得して使用する方法を記載します。
■手順
以下のように記載することで、スプラッシュのViewを取得できます。
let splashStoryboardName = Bundle.main.object(forInfoDictionaryKey: "UILaunchStoryboardName") as? String ?? ""
let storyboard = UIStoryboard(name: splashStoryboardName, bundle: nil)
let viewController = storyboard.instantiateInitialViewController()
let splashView = viewController?.view ?? UIView()
まずは以下でSplashで使用しているStoryboardの名前を取得します。
基本は「LaunchScreen」になっていると思いますが、変更されても問題ないようにInfo.plistから取得しています。
Info.plistの「Launch screen interface file base name」がSplashのストーリーボード名です。
let splashStoryboardName = Bundle.main.object(forInfoDictionaryKey: "UILaunchStoryboardName") as? String ?? ""
上記で取得したStoryboard名から、Storyboardのインスタンスを取得します。
let storyboard = UIStoryboard(name: splashStoryboardName, bundle: nil)
取得したStoryboardの「Is Initial View Controller」にチェックされているViewControllerを取得します。
let viewController = storyboard.instantiateInitialViewController()
該当のViewControllerの一番親のViewを取得します。
※このViewがスプラッシュのViewになります。
let splashView = viewController?.view ?? UIView()
■おまけ
以下のようにすることで、どのような画面でも、一番上にスプラッシュのViewを表示することが可能です。
let splashStoryboardName = Bundle.main.object(forInfoDictionaryKey: "UILaunchStoryboardName") as? String ?? ""
let storyboard = UIStoryboard(name: splashStoryboardName, bundle: nil)
let viewController = storyboard.instantiateInitialViewController()
let splashView = viewController?.view ?? UIView()
let window = UIApplication.shared.keyWindow!
window.addSubview(splashView);
任意のタイミングで、以下のようにViewを破棄することで、スプラッシュ表示前の画面に戻せます。
splashView.removeFromSuperview()