(Xcode6、iOS8、Swift、iPad)
ダイアログボックスの外側が「グレーアウト」されている、古典的なWebのようなモーダルビューを作成しようとしています。これを実現するために、モーダルのビューのbackgroundColorのアルファ値を0.5に設定しました。
self.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
唯一の問題は、モーダルがフルスクリーンになると、表示中のビューが削除されることです。 (参照 Navigation Controllerの透過モード表示 )。
(ここでの概念に少しイライラします。なぜ基礎ビューを削除するのですか?モーダルは、定義上、他のコンテンツの上に表示されます。基礎ビューが削除されると、モーダルではなくなります。モーダルとプッシュの間のどこかにあります。わわわわ...とにかく..)
これを防ぐために、親コントローラーのmodalPresentationStyle
メソッドとStoryboardでCurrentContext
をviewDidLoad
に設定しましたが、運はありません。
self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
モーダルが全画面表示になったときに、表示中のビューが削除されないようにするにはどうすればよいですか?
tyvm ..詳細は以下をご覧ください。
ストーリーボードでも同様です(プレゼンテーション:現在のコンテキスト)
あなたの助けのためのThx ...以下のドキュメント:
まず、コード内のモーダルプレゼンテーションスタイルの明示的な設定をすべて削除し、次の操作を行います。
modalPresentation
スタイルをOver Current context
に設定しますProvide Context
とDefine Context
。彼らは未チェックでも動作しているようです。Swiftでこのコードを試すことができます
let popup : PopupVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopupVC") as! PopupVC
let navigationController = UINavigationController(rootViewController: popup)
navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.presentViewController(navigationController, animated: true, completion: nil)
For Swift 4拡張機能を使用した最新の構文
extension UIViewController {
func presentOnRoot(`with` viewController : UIViewController){
let navigationController = UINavigationController(rootViewController: viewController)
navigationController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
self.present(navigationController, animated: false, completion: nil)
}
}
使用方法
let popup : PopupVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopupVC") as! PopupVC
self.presentOnRoot(with: popup)
コードで見られる唯一の問題は、CurrentContext
の代わりにOverCurrentContext
を使用していることです。
だから、これを置き換えます:
self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
このため:
self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
これを機能させるための唯一の方法は、表示するView Controllerでこれを行うことでした。
func didTapButton() {
self.definesPresentationContext = true
self.modalTransitionStyle = .crossDissolve
let yourVC = self.storyboard?.instantiateViewController(withIdentifier: "YourViewController") as! YourViewController
let navController = UINavigationController(rootViewController: yourVC)
navController.modalPresentationStyle = .overCurrentContext
navController.modalTransitionStyle = .crossDissolve
self.present(navController, animated: true, completion: nil)
}
これはSwift 5.0で機能しました。IDインスペクターでStoryboard IDを「destinationVC」として設定します。
@IBAction func buttonTapped(_ sender: Any) {
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let destVC = storyboard.instantiateViewController(withIdentifier: "destinationVC") as! MyViewController
destVC.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
destVC.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
self.present(destVC, animated: true, completion: nil)
}
コードからmodalPresentationStyleを設定する際の問題は、親View Controllerではなく、提示されたView Controllerのinit()メソッドで設定する必要があることでした。
UIKit docsから:「このView Controllerがモーダルで提示されるときに使用される遷移スタイルを定義します。プレゼンターではなく、提示されるView Controllerでこのプロパティを設定します。デフォルトはUIModalTransitionStyleCoverVerticalです。」
ViewDidLoadメソッドは、View Controllerを既に表示した後にのみ呼び出されます。
2番目の問題は、UIModalPresentationStyle.overCurrentContextを使用する必要があることです。
簡単なソリューションを更新しています。まず、モーダルを表すIDをセグエに追加します。プロパティを変更するよりも、プレゼンテーションスタイルを「Over Current Context」に変更します。 View Controller(モーダルを表示しているコントローラー)にこのコードを追加するよりも。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let Device = UIDevice.currentDevice()
let iosVersion = NSString(string: Device.systemVersion).doubleValue
let iOS8 = iosVersion >= 8
let iOS7 = iosVersion >= 7 && iosVersion < 8
if((segue.identifier == "chatTable")){
if (iOS8){
}
else {
self.navigationController?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
}
}
}
Segue.identifierを自分のIDに変更してください;)