web-dev-qa-db-ja.com

Swiftで現在のビューの上にモーダルを表示する方法

(Xcode6、iOS8、Swift、iPad)

ダイアログボックスの外側が「グレーアウト」されている、古典的なWebのようなモーダルビューを作成しようとしています。これを実現するために、モーダルのビューのbackgroundColorのアルファ値を0.5に設定しました。

self.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)

唯一の問題は、モーダルがフルスクリーンになると、表示中のビューが削除されることです。 (参照 Navigation Controllerの透過モード表示 )。

(ここでの概念に少しイライラします。なぜ基礎ビューを削除するのですか?モーダルは、定義上、他のコンテンツの上に表示されます。基礎ビューが削除されると、モーダルではなくなります。モーダルとプッシュの間のどこかにあります。わわわわ...とにかく..)

これを防ぐために、親コントローラーのmodalPresentationStyleメソッドとStoryboardでCurrentContextviewDidLoadに設定しましたが、運はありません。

    self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
    self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext

モーダルが全画面表示になったときに、表示中のビューが削除されないようにするにはどうすればよいですか?

tyvm ..詳細は以下をご覧ください。

ストーリーボードでも同様です(プレゼンテーション:現在のコンテキスト)

enter image description here

あなたの助けのためのThx ...以下のドキュメント:

enter image description here

26
kmiklas

まず、コード内のモーダルプレゼンテーションスタイルの明示的な設定をすべて削除し、次の操作を行います。

  1. ストーリーボードで、ModalViewControllerのmodalPresentationスタイルをOver Current contextに設定します

img1

  1. ルート/現在のViewControllerのチェックボックスをチェックします-Provide ContextDefine Context。彼らは未チェックでも動作しているようです。
42
Riskov

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)
16
Hardik Thakkar

コードで見られる唯一の問題は、CurrentContextの代わりにOverCurrentContextを使用していることです。

だから、これを置き換えます:

self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext

このため:

self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
13
Ivens Denner

これを機能させるための唯一の方法は、表示する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)
}
2
user7097242

これは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)
}
2
AceRam

コードからmodalPresentationStyleを設定する際の問題は、親View Controllerではなく、提示されたView Controllerのinit()メソッドで設定する必要があることでした。

UIKit docsから:「このView Controllerがモーダルで提示されるときに使用される遷移スタイルを定義します。プレゼンターではなく、提示されるView Controllerでこのプロパティを設定します。デフォルトはUIModalTransitionStyleCoverVerticalです。」

ViewDidLoadメソッドは、View Controllerを既に表示した後にのみ呼び出されます。

2番目の問題は、UIModalPresentationStyle.overCurrentContextを使用する必要があることです。

2

簡単なソリューションを更新しています。まず、モーダルを表す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に変更してください;)

1
Saqib Omer