新しいiOS 13モーダルプレゼンテーション:プレゼンテーションコントローラーが下に移動しない


11

iOS 13でUIViewControllersをモーダルに表示すると、奇妙な動作が発生します。iOS13全体で見た新しいプレゼンテーションスタイルは、次のようになります。

提示するビューコントローラは、提示されるビューコントローラの背後に表示されます。また、「スタック」を模倣するために下にシフトされます

提示するビューコントローラは、提示されるビューコントローラの背後に表示されます。 また、「スタック」を模倣するために下にシフトされます

一方、私のアプリを介してビューコントローラーを提示するとき、私はこの効果を得続けます:

新しいビューコントローラを提示するときに、提示するビューコントローラがまったく移動しない

新しいビューコントローラを提示するときに、提示するビューコントローラがまったく移動しない

このコードを使用して、このビューコントローラを表示します。

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

これが私の質問です: なぜこれが起こっているのか、そしてビューコントローラーを通常のiOS 13スタイルで表示する方法(ビューコントローラーを元に戻す)があるのか​​どうか疑問に思っています。

前もって感謝します!


テストとして、controller.modalTransitionStyle = .coverVerticalさらにコメントアウトしてみてくださいcontroller.modalPresentationStyle = .pageSheet(ただし、このコードがiPadでも実行される場合は、プレゼンテーションスタイルが必要になります)。
rmaddy

コメントアウトしましたが、何も変わりません:(
CentrumGuy

回答:


3

問題は私のビューコントローラーの階層にあることがわかりました。表示するビューコントローラーをアプリのルートビューコントローラーにすることで、問題を修正できました。まず、バックグラウンドコントローラーをルートビューコントローラーとして設定します

window.rootViewController = self

そして私の以前のコードを使用して

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

ビューコントローラーを紹介しました。手伝ってくれた皆さん、ありがとう!


私は同じ問題を抱えています。rootViewControllerフラグをどこに設定しましたか?セグエの直前?
パヴェルZgoda-Ferchmin

「バックグラウンドコントローラー」を提示した時に設定しました。コントローラー1、2、3と呼びましょう(1が一番後ろ、2が後ろの背景、3が手前のチュートリアルコントローラー、つまりチュートリアルコントローラー)。現在、コントローラー1を見ています。コントローラー1のpresent()を呼び出してコントローラー2を提示する代わりに、コントローラー2をルートビューコントローラーとして設定するだけです。これは基本的にコントローラー1を取り除き、ウィンドウの階層にはコントローラー2のみが含まれます。さて、あなたは通常、コントローラ2上の存在を()を呼び出して3コントローラを提示することができます
CentrumGuy

確かに、それは私にとってはうまくいきますが、ステータスバーが消えたり、セグエ中にアニメーションが切断されたりするなど、さまざまな問題が発生します。また、安全だとは思いません。これに対するよりよい解決策が存在しなければならない...
パヴェルZgoda-Ferchmin

これらの問題はいつ発生しますか?present()を呼び出すとき、またはルートView Controllerを設定するとき?ステータスバーが消えるのは、ステータスバーが黒のテキストで表示され、present()が発生してアプリケーションの背景に溶け込んだときに黒い背景に表示されるためです。
CentrumGuy

1
簡単なデモプロジェクトを作成しました。githubで確認できます。ロジックはすべてController1.swiftにあります。これが役立つかどうか教えてください!
CentrumGuy

1

問題vc.modalPresentationStyle = .fullScreenはUINavigationControllerがない場合に使用することで解決できると思います。そうでない場合は、これらのコードを次のように使用できます。

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

iOS 13では、これはAppleがビューコントローラーのデフォルトのプレゼンテーションスタイルをiOS 12のフルスクリーンからモーダルシートに変更した新機能であるため


2
.fullScreenは、背後にあるコントローラーがまったく見えない古いiOS 12プレゼンテーションのように見えます。それは私が目指していることではありません。
CentrumGuy

@CentrumGuyさん、「medium.com/better-programming/…」というリンクが見えるかもしれませんが、詳しく説明しました。
Appleは

1
iOS 13でAppleがデフォルトのプレゼンテーションスタイルを変更したことを知っています。ただし、アプリにビューコントローラーを表示すると、iOS 13の他の場所と同じようにプレゼンテーションコントローラーが移動しません。1番目と2番目の違いを確認できます。表示しているView Controllerが一番上のView Controllerの後ろに表示される方法での写真。私に最初の写真のように表示させたい
CentrumGuy

お役に立ててうれしいです!
グロチャ

1

プログラム的に:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

ストーリーボードから:

ここに画像の説明を入力してください

それでおしまい。ルートコントローラーやウィンドウで遊ぶ必要はまったくありません。

参考として、こちらの記事をご覧ください


0

インスペクタツールバーで変更できます。それを達成するには:Inspector Tollbarの5番目のセクションに移動し、次にPresentationフィールドをFull Screenに変更します。


-1

これは、設定する必要がある唯一のプロパティである必要があります

presentedViewController.modalPresentationStyle = .automatic

詳しくは https://developer.apple.com/videos/play/wwdc2019/224/をご覧ください


自動に設定してもこの問題は修正されないようです
CentrumGuy

フォアグラウンドView Controllerの背後にあるView Controllerは、私が「プレゼント」と呼ぶものです。(コントローラーの後ろで見ることができるもの)
CentrumGuy

それは根ですか?あなたはwindow.rootViewControllerをチェックすることができます
glotcha
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.