このよくある質問に対する完全で決定的な回答はないので、ここで質問して回答します。
UIViewController
下の図のように、全画面をカバーしないように表示する必要があることがよくあります。
Apple は、Twitter や Facebook 共有ビュー コントローラーUIViewController
など、いくつかの同様の を提供しています。UIAlertView
カスタムコントローラーでこの効果を実現するにはどうすればよいでしょうか?
このよくある質問に対する完全で決定的な回答はないので、ここで質問して回答します。
UIViewController
下の図のように、全画面をカバーしないように表示する必要があることがよくあります。
Apple は、Twitter や Facebook 共有ビュー コントローラーUIViewController
など、いくつかの同様の を提供しています。UIAlertView
カスタムコントローラーでこの効果を実現するにはどうすればよいでしょうか?
注 : このソリューションは iOS 8 では壊れています。新しいソリューションをできるだけ早く投稿します。
ここでは絵コンテを使って回答しますが、絵コンテなしでも可能です。
Init:ストーリーボードに2 つ作成UIViewController
します。
FirstViewController
どちらが正常で、SecondViewController
どちらがポップアップになるか
を言いましょう。モーダル セグエ: FirstViewControllerに入れ、これにモーダル セグエとしてUIButton
セグエを作成します。UIButton
SecondViewController
透明にする:UIView
(UIView
でデフォルトで作成されるUIViewController
) を選択SecondViewController
し、背景色を透明色に変更します。
背景を薄暗くする:画面全体を覆うを追加し、UIImageView
そのSecondViewController
画像を薄暗い半透明の画像に設定します。ここからサンプルを取得できます:UIAlertView
背景画像
表示デザイン:を追加して、表示UIView
したい任意の種類のデザインを作成します。ここに私のストーリーボードのスクリーンショットがあります
SecondViewController
ここでは、ユーザー名とパスワードを尋ねるポップアップとして開くログイン ボタンにセグエを追加しました。重要:これが主なステップです。FirstViewController をSecondViewController
完全に非表示にしないでください。クリアカラーを設定しましたが、これでは不十分です。デフォルトでは、モデル プレゼンテーションの背後に黒が追加されるため、 の viewDidLoad に 1 行のコードを追加する必要がありFirstViewController
ます。別の場所に追加することもできますが、セグエの前に実行する必要があります。
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
却下:いつ却下するかは、ユース ケースによって異なります。これはモーダル プレゼンテーションであるため、モーダル プレゼンテーションと同じように処理します。
[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]
}
これは、Interface Builder で行うことができます。
今尾が UIImageView を背景に置くのは良い考えではありません。私の場合、コントローラービューに他の2つのビューを追加しました。最初のビューには[UIColor clearColor]
背景があり、2番目に透明にしたい色(私の場合は灰色)があります。順序が重要であることに注意してください。次に、2番目のビューではアルファ0.5(アルファ> = 0 <= 1)を設定します。これを行に追加しましたprepareForSegue
infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;
それだけです。
スウィフト 4:
オーバーレイまたはポップアップ ビューを追加するには、コンテナ ビューを使用して無料のビュー コントローラを取得することもできます (通常のオブジェクト パレット/ライブラリからコンテナ ビューを取得します)。
手順:
このコンテナー ビューを保持するビュー (図の ViewForContainer) を用意して、コンテナー ビューのコンテンツが表示されているときにそれを暗くします。最初のView Controller内にコンセントを接続します
最初の VC のロード時にこのビューを非表示にする
コンテナ ビューのコンテンツが表示されているときにこのビューを暗くするには、ビューの背景を黒に、不透明度を 30% に設定します。
これを行うと、他のサブビューをビュー コントローラーに追加できます。最初に、サブビューとして追加する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];
}
ご不明な点がございましたら、お気軽にお問い合わせください...