1. ホーム
  2. ios

iPhoneでUIViewControllerをポップアップとして表示する

2023-09-18 17:58:18

質問

このよくある繰り返しの質問に対する完全で決定的な回答はありませんので、ここで質問と回答をさせていただきます。

多くの場合、私たちは UIViewController を画面全体に表示する必要があります。

Apple は、いくつかの似たような UIViewController のような UIAlertView や、TwitterやFacebookのシェアビューコントローラーなどです。

カスタムコントローラでこの効果を得るにはどうしたらよいでしょうか?

どのように解決するのですか?

注:この解決策はiOS 8で壊れています。新しい解決策を早急に掲載します。

ストーリーボードを使用して回答しますが、ストーリーボードなしでも可能です。

  1. 初期値です。 2つの UIViewController を作成する。

    • とすると FirstViewController は正常で SecondViewController がポップアップになります。

  2. モーダルセグエです。 置く UIButton をFirstViewControllerに配置し、この上にセグエを作成します。 UIButton から SecondViewController をモーダルセグエとする。

  3. 透明にする。 次に UIView ( UIView というのは、デフォルトで作成される UIViewController を含む)の SecondViewController で、その背景色をクリア色に変更します。

  4. 背景をDimにする。 背景を薄くする UIImageViewSecondViewController で、画面全体を覆い、その画像を半透明な画像にする。サンプルはここから入手できます。 UIAlertView 背景画像

  5. ディスプレイのデザイン。 次に UIView を追加して、表示したいデザインを自由に作ってください。以下は、私のストーリーボードのスクリーンショットです。

    • ここでは、ログインボタンにセグエを追加しています。 SecondViewController をポップアップとして開き、ユーザ名とパスワードを尋ねる。
  6. 重要です。 さて、そのメインステップ。私たちが欲しいのはその SecondViewController がFirstViewControllerを完全に隠さないようにしたいのです。我々はクリアカラーを設定しましたが、これだけでは十分ではありません。デフォルトではモデル表示の後ろに黒が追加されます。 FirstViewController . 他の場所に追加することもできますが、セグエの前に実行する必要があります。

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. 解散してください。 いつ解散させるかは、ユースケースによります。これはモーダルプレゼンテーションなので、モーダルプレゼンテーションのために行うことを解除するために、私たちは行います。

    [self dismissViewControllerAnimated:YES completion:Nil];

以上......。

どんな提案やコメントでも歓迎します。

デモの様子。 あなたはここからデモのソースプロジェクトを取得することができます。 ポップアップデモ

新しい : 誰かがこのコンセプトで非常に素晴らしい仕事をした。 MZFormSheetController

新しい : このような機能を得るためのコードをもう一つ見つけました。 KLCPopup


iOS 8 アップデート : このメソッドはiOS 7とiOS 8の両方で動作するようにしました。

+ (void)setPresentationStyleForSelfController:(UIViewController *)selfController presentingController:(UIViewController *)presentingController
{
    if (iOSVersion >= 8.0)
    {
        presentingController.providesPresentationContextTransitionStyle = YES;
        presentingController.definesPresentationContext = YES;

        [presentingController setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    }
    else
    {
        [selfController setModalPresentationStyle:UIModalPresentationCurrentContext];
        [selfController.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
    }
}


このメソッドはprepareForSegueデリゲート内で次のように使用することができます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    PopUpViewController *popup = segue.destinationViewController;
    [self setPresentationStyleForSelfController:self presentingController:popup]
}