75

このよくある質問に対する完全で決定的な回答はないので、ここで質問して回答します。

UIViewController下の図のように、全画面をカバーしないように表示する必要があることがよくあります。

ここに画像の説明を入力

Apple は、Twitter や Facebook 共有ビュー コントローラーUIViewControllerなど、いくつかの同様の を提供しています。UIAlertView

カスタムコントローラーでこの効果を実現するにはどうすればよいでしょうか?

4

8 に答える 8

95

注 : このソリューションは iOS 8 では壊れています。新しいソリューションをできるだけ早く投稿します。

ここでは絵コンテを使って回答しますが、絵コンテなしでも可能です。

  1. Init:ストーリーボードに2 つ作成UIViewControllerします。

    • FirstViewControllerどちらが正常で、SecondViewControllerどちらがポップアップになるか を言いましょう。

  2. モーダル セグエ: FirstViewControllerに入れ、これにモーダル セグエとしてUIButtonセグエを作成します。UIButtonSecondViewController

  3. 透明にする:UIView (UIViewでデフォルトで作成されるUIViewController) を選択SecondViewControllerし、背景色を透明色に変更します。

  4. 背景を薄暗くする:画面全体を覆うを追加し、UIImageViewそのSecondViewController画像を薄暗い半透明の画像に設定します。ここからサンプルを取得できます:UIAlertView背景画像

  5. 表示デザイン:を追加して、表示UIViewしたい任意の種類のデザインを作成します。ここに私のストーリーボードのスクリーンショットがあります 絵コンテ

    • SecondViewControllerここでは、ユーザー名とパスワードを尋ねるポップアップとして開くログイン ボタンにセグエを追加しました。
  6. 重要:これが主なステップです。FirstViewController をSecondViewController完全に非表示にしないでください。クリアカラーを設定しましたが、これでは不十分です。デフォルトでは、モデル プレゼンテーションの背後に黒が追加されるため、 の viewDidLoad に 1 行のコードを追加する必要がありFirstViewControllerます。別の場所に追加することもできますが、セグエの前に実行する必要があります。

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. 却下:いつ却下するかは、ユース ケースによって異なります。これはモーダル プレゼンテーションであるため、モーダル プレゼンテーションと同じように処理します。

    [self dismissViewControllerAnimated:YES completion:Nil];

それで全部です.....

どんな種類の提案やコメントも大歓迎です。

デモ : ここからデモ ソース プロジェクトを取得できます :ポップアップ デモ

NEW : 誰かがこの概念について非常に素晴らしい仕事をしました: MZFormSheetController
New : この種の関数を取得するためのコードをもう 1 つ見つけました: KLCPopup


iOS 8 Update : 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]
}
于 2013-04-26T07:13:05.347 に答える
13

これは、Interface Builder で行うことができます。

  • モーダルに表示したいビューの最も外側のビューの背景を透明に設定します
  • コントロール + クリック アンド ドラッグでホスト ビュー コントローラーからモーダル ビュー コントローラーに移動
  • 現在のモーダルを選択
  • 新しく作成されたセグエをクリックし、属性インスペクター (右側) で「プレゼンテーション」を「現在のコンテキスト」に設定します。
于 2015-08-25T00:52:56.223 に答える
1

今尾が UIImageView を背景に置くのは良い考えではありません。私の場合、コントローラービューに他の2つのビューを追加しました。最初のビューには[UIColor clearColor]背景があり、2番目に透明にしたい色(私の場合は灰色)があります。順序が重要であることに注意してください。次に、2番目のビューではアルファ0.5(アルファ> = 0 <= 1)を設定します。これを行に追加しましたprepareForSegue

infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;

それだけです。

于 2016-05-04T13:47:51.233 に答える
1

スウィフト 4:

オーバーレイまたはポップアップ ビューを追加するには、コンテナ ビューを使用して無料のビュー コントローラを取得することもできます (通常のオブジェクト パレット/ライブラリからコンテナ ビューを取得します)。

ここに画像の説明を入力

手順:

  1. このコンテナー ビューを保持するビュー (図の ViewForContainer) を用意して、コンテナー ビューのコンテンツが表示されているときにそれを暗くします。最初のView Controller内にコンセントを接続します

  2. 最初の VC のロード時にこのビューを非表示にする

  3. ボタンがクリックされたときに再表示 ここに画像の説明を入力

  4. コンテナ ビューのコンテンツが表示されているときにこのビューを暗くするには、ビューの背景を黒に、不透明度を 30% に設定します。

ここに画像の説明を入力

ボタンをクリックすると、この効果が得られます ここに画像の説明を入力

于 2018-04-09T09:15:38.613 に答える
0

これを行うと、他のサブビューをビュー コントローラーに追加できます。最初に、サブビューとして追加するViewControllerのステータスバーをNoneに設定して、必要に応じてサイズを変更できるようにします。次に、Present View コントローラーでボタンを作成し、ボタン クリックのメソッドを作成します。メソッドでは:

- (IBAction)btnLogin:(id)sender {
    SubView *sub = [[SubView alloc] initWithNibName:@"SubView" bundle:nil];
    sub.view.frame = CGRectMake(20, 100, sub.view.frame.size.width, sub.view.frame.size.height);
    [self.view addSubview:sub.view];
}

ご不明な点がございましたら、お気軽にお問い合わせください...

于 2013-04-26T07:53:01.823 に答える