iOS:背景が透明なモーダルViewController


180

透明な背景で、ビューコントローラーをモーダルで表示しようとしています。私の目標は、表示と表示の両方のView Controllerのビューを同時に表示できるようにすることです。問題は、提示するアニメーションが終了すると、提示するビューコントローラのビューが消えることです。

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

ビューをサブビューとして追加できることはわかっていますが、何らかの理由でこの解決策を避けたいと思います。どうすれば修正できますか?


4
私と同じように、マイケルのような@TheKingサウンドは、モーダルビューを半透明にし、プライマリ(プレゼンテーション)ビューの上にホバリングゲルレイヤーとして表示することを望んでいます。(別のビューで)他のいくつかの主要な機能に移動するのではなく、ユーザーが現在のコンテキストにとどまりながらクイック設定を行う感覚を作成します。
バジルブルク2013

このstackoverflow.com/q/27598846/1603234は私を笑顔にして、今度はあなたの番です:)
Hemang

ここに私の答えを参照してくださいstackoverflow.com/a/29794201/1606125 iOSの8のために
パンカジWadhwa

迅速なバージョンはこちらstackoverflow.com/a/34578402/3380878
Mojtabye

1
iOS 10の場合、下記のinigo333のようにUIModalPresentationOverFullScreenが機能しています。
Josef Rysanek 2016

回答:


97

次のコードはiPadでのみ機能します。

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

サブビューを追加していきます。

これは非常に良い議論です。特にコメントを見てください。答えだけではありません。

モーダルビュー

もし私があなただったら、私はそれをしなかったでしょう。サブビューを追加して実行します。それは私に物事のより良い制御を与えるようです。

編集:

Paul Linsayが述べたように、iOS 8以降、必要なのはUIModalPresentationOverFullScreen、表示されるViewControllerのmodalPresentationStyleだけです。これは、navigationBarボタンとtabBarボタンもカバーします。


18
それはないのiOS 7上で作業をしても、iPhone上で、事はあなたが指定しなければならないということであるmodalPresentationStyle = UIModalPresentationCurrentContextプレゼンターのビューコントローラ、およびないで提示 1。
redent84 2014年

6
はい、動作しますが、ビュー階層の上位 ViewControllerにこれを設定した場合のみです。(たとえばNavigationController、スライドメニュービューコントローラのインスタンスなど)。
iGranDav 2014年

4
奇妙なことに、私の場合、モーダルスタイルをに設定した後にのみ機能しUIModalPresentationCustom、ででpresentViewControllerはなく直前に設定した場合にのみ機能しましたviewDidLoad
mojuba 2016年

5
iOS 8以降、必要なのは、表示されているViewControllerのmodalPresentationStyleのUIModalPresentationOverFullScreenだけです。
Paul Linsay 2016年

1
約1000回試行した後、modalPresentationStyle viewDidLoadに設定する必要があることに気付きました。私はコンストラクターでそれを行い、それはうまくいきました。
bendytree

186

これをiOS 8で動作させようとする人にとって、透明なモーダルビューコントローラーを表示する「アップル承認」の方法はmodalPresentationStyle 、現在のedコントローラーをに設定すること UIModalPresentationOverCurrentContextです。

これは、コードで、またはストーリーボードでセグエのプロパティを設定することで実行できます。

UIViewControllerドキュメントから:

UIModalPresentationOverCurrentContext

親View Controllerのコンテンツの上にのみコンテンツが表示されるプレゼンテーションスタイル。プレゼンテーションが終了しても、提示されたコンテンツの下のビューはビュー階層から削除されません。そのため、提示されたView Controllerが不透明なコンテンツで画面を満たさない場合、基になるコンテンツが透けて見えます。

ポップオーバーでビューコントローラーを表示する場合、このプレゼンテーションスタイルは、遷移スタイルがUIModalTransitionStyleCoverVerticalの場合にのみサポートされます。別の遷移スタイルを使用しようとすると、例外がトリガーされます。ただし、親のビューコントローラーがポップオーバーにない場合は、他の遷移スタイル(部分的なカール遷移を除く)を使用できます。

iOS 8.0以降で利用できます。

https://developer.apple.com/documentation/uikit/uiviewcontroller

WWDC 2014の「View Controller Advancements in iOS 8」のビデオで、これについて詳しく説明しています。

注意:

  • 実際にシースルーにならないように、表示されたビューコントローラーには明確な背景色を指定してください。
  • 提示する前にこれを設定する必要があります。つまりviewDidLoad、presentedViewControllerのでこのパラメータを設定しても影響はありません。

32
-modalPresentationStyleを設定する必要があるターゲットが変更されたようです。たとえば、iOS 7では、これを機能させるために、モーダルを開こうとしたビューコントローラーのmodalPresentationStyleをUIModalPresentationCurrentContextに設定する必要がありました。ただし、これをiOS8で機能させるには、表示されるモーダルビューのmodalPresentationStyleをUIModalPresentationOverCurrentContextに設定する必要がありました
u2Fan 2014

1
ストーリーボードでセグエを使用する場合は、そこでプレゼンテーションスタイルを設定する必要があります。少なくともこれは私にとってうまくいったものです。
ジュリアンB.

提示されたビューコントローラーのinitメソッドに次の3行を追加しました。これはチャームのように機能します。self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [self setModalPresentationStyle:UIModalPresentationOverCurrentContext];
inigo333 2016年

2
iOS 8以降では、UINavigationControllerからモーダルを提示する必要があったため、子から提示しても必要なものが提供されませんでした。代わりに、sourceVCですself.navigationController。また、ターゲットのプレゼンテーションスタイルをカスタムに設定して初めて、それが透けて見えるようになりました。[sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];[targetVC setModalPresentationStyle:UIModalPresentationCustom];うまくいけば、それは誰かを助けるでしょう。
devdc 2016年

注-通話presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext中に提示する VC。presentVCでは動作しません。信じて、試してみた。
スマイルハム2016年

104

iOS 8.0以降では、プロパティmodalPresentationStyleUIModalPresentationOverCurrentContextに設定することで実行できます。

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:presentedController animated:YES completion:nil];

添付画像を見る


5
これが私が仕事に取りかかることができる唯一の解決策です。とても簡単です。これを、モーダルセグエの前の現在のVCに追加するだけです。
Siriss、2015年

1
Xcoe 9.2 / iOSの11.2迅速.customかつ.overFullScreen仕事。
William Hu

そして.overFullScreen、現在のビューコントローラを設定するviewWillAppearと、呼び出されないようです。
William Hu

もう一つは、presentedController.view.backgroundColor = #color#中に書かれるべきpresentedControllerviewDidLoad、または他presentedControllerの人生が中断されました。
DawnSong

44

このコードは、iOS6およびiOS7のiPhoneで正常に動作します。

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

この場合、スライドオンのアニメーションを見逃します。アニメーションを保持するには、次の「エレガントでない」拡張機能を使用できます。

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

presentingVがUINavigationControllerまたはUITabbarController内にある場合は、そのコントローラーをpresentingVCとして操作する必要があります。

さらに、iOS7では、カスタム遷移アニメーション適用UIViewControllerTransitioningDelegateプロトコルを実装できます。もちろん、この場合、透明な背景を得ることができます

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

まず、提示する前に設定する必要があります modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

次に、2つのプロトコルメソッドを実装する必要があります。

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

最後に、CustomAnimatedTransitioningクラスでカスタム遷移を定義します

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}

7
これが機能することを確認しました。NOTEあなたのViewControllerがnavigationController内にある場合は、そのは確実ということmodalPresentationStyleにも設定されています!
mxcl 2013

最も一般的なケースでは、ナビゲーションコントローラーをpresentingVCとして扱うことをお勧めします。
malex 2013

はい、このmodalPresentationStyleを使用してアニメーションを表示することは不可能です((
malex

2
@alexはい、申し訳ありません。私の間違いは、prenstingVCではなくpresentedVCのmodalPresentationStyleをUIModalPresentationCurrentContextに設定することでした。
tiguero 2014年

5
@mxclそして、viewControllerのnavigationController自体がtabBarController内にある場合、そのmodalPresentationStyleも設定されていることを確認してください;)
Thomas CG de Vilhena

21

@VenuGopalTewariが提案するように、XCode 7のインターフェイスビルダーでプレゼンテーションスタイルを設定するのに少し苦労しました。このバージョンでは、何もないように思わOver Current ContextOver Full Screenセグエのためのプレゼンテーションモード。したがって、それを機能させるには、モードをDefault次のように設定します。

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

さらに、モーダルプレゼンテーションビューコントローラーのプレゼンテーションモードを次のように設定しますOver Full Screen

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


これでうまくいきました。コードは必要ありません。私はXcode 7.2を使用していますが、ターゲットはiOS 8.0です
LightMan

これも私にとってはうまくいきました。正解は+1。ありがとう:)
オーガスティンPA

ここでベストアンサー!
shinyuX 2016

1
コードなし=ベストアンサー。バスティアンがこのゲームに勝利した。Plz all +1 this answer。
GeneCode

この回答は機能しました。これに1時間以上費やしました
user578386

18

モーダルに提示するセグエを作成し、そのセグエのPresentationプロパティを現在のコンテキスト全体に設定すると、100%機能します

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


3
100%確実なものに感心しました、それはうまくいきました!重要なのは、それをセグエに適用することです。どうもありがとうございました
Badr

セグエがボタンに接続されておらず、それをプログラムで呼び出す場合は、必ず識別子を設定し、presentViewControllerの代わりにperformSegueWithIdentifierを呼び出すようにしてください
user3344977

1
私は他のすべての答えを試しましたが、iOS9で私のために働いたのはこれだけです。
endavid 2016年

14

背景が透明なPresentViewController-iOS 8およびiOS 9

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

そしてMYViewControllerで背景色を黒に設定し、不透明度を減らします


12

少しハッキーな方法ですが、私にとってこのコードは機能します(iOS 6):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

このコードはiPhoneでも機能します


ありがとう-これはまさに私が必要としたものです-メインのホームの上に最初の「ヘルプ」画面を表示します。綺麗な!
Matt H

1
今日、私は3時間近くかけて、iOS7とiOS8の両方で機能するソリューションを参照して検索しています。この回答が1.5年前のものであり、ECSlidingViewControllerを使用しているという事実を考慮すると、これが機能した唯一のソリューションです。@Makに感謝します。
センチュリオン

完璧です。また、アニメーションが気にならない場合は、内側の完成の3行が完全に機能します。ありがとうございます。
RasTheDestroyer、2015年

成功せずに3時間過ごした後、これを見つけて乾杯しました。もっと投票できるといいのですが:D
alessioarsuffi

11

このカテゴリは私のために働いた(ios 7、8および9)

Hファイル

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

Mファイル

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end

1
私はすべての答えをチェックしました。しかし、私にとってあなたの答えは完璧な仕事です。@テッド
g212gs

1
解決策が見つからないと思った。どうもありがとう!
CopperCash

10

Swiftを使用したこの回答の解決策は次のようになります。

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)

9

ストーリーボードを使用している場合は、次の手順に従います。

  1. ビューコントローラー(V2)を追加し、UIを希望どおりに設定します。
  • UIViewを追加します-背景を黒に、不透明度を0.5に設定します
  • 別のUIView(2)を追加します-これはポップアップとして機能します(Plsは、UIViewとUIView(2)が同じレベル/階層を持つ必要があることに注意してください。イメージビューをビューの子にしないでください。そうでない場合、uiviewの不透明度はUIView(2)に影響します)
  1. V2をモーダルに提示する

  2. セグエをクリックします。属性インスペクタで、プレゼンテーションを[ 全画面表示]に設定します。必要に応じてアニメーションを削除します

ストーリーボード

  1. V2を選択します。属性インスペクタで、プレゼンテーションを[ 全画面表示]に設定します。チェックはコンテキストを定義し、コンテキストを提供します

ストーリーボード

  1. V2のMainViewを選択します(Pls。Check画像)。backgroundColorをClear Colorに設定します

ストーリーボード


6

提示されたビューコントローラーのinitメソッドに次の3行を追加しました。これは魅力のように機能します。

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

編集(iOS 9.3で動作):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

ドキュメントに従って:

UIModalPresentationOverFullScreen 表示されたビューが画面を覆うビュープレゼンテーションスタイル。プレゼンテーションが終了しても、提示されたコンテンツの下のビューはビュー階層から削除されません。そのため、表示されたView Controllerが不透明なコンテンツで画面を満たさない場合、基になるコンテンツが透けて見えます。

iOS 8.0以降で利用できます。


1
iOS 10.2での作業。
Josef Rysanek 2016

4

別の方法は、「コンテナビュー」を使用することです。アルファを1未満にし、sequeを埋め込むだけです。XCode 5、ターゲットiOS7。iPhoneでテスト済み。

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

iOS6から利用可能なコンテナービュー。 それに関するブログ投稿へのリンク


3

私は「重ね合わせモーダル」と呼ばれるものの表示を処理するオブジェクトを作成しました。これは、背景のビューを保持し、透明な背景を持つモーダルを持つことができることを意味します。

これには、これを行う単一の単純なメソッドがあります。

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

提示されたビューコントローラーが異なる場合、modalPresentationCapturesStatusBarAppearanceプロパティをに設定しYES、ステータスバーの外観を強制的に更新することが重要ですpreferredStatusBarStyleです。

このオブジェクトには @property (assign, nonatommic) isPresenting

このオブジェクトがUIViewControllerAnimatedTransitioningおよびUIViewControllerTransitioningDelegateプロトコルに準拠し、次のメソッドを実装するようにします。

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

そして:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

これは、デフォルトのモーダルアニメーションを模倣した下からスライドインアニメーションを実行しますが、好きなように作成できます。

重要なことは、現在のビューコントローラのビューが背面に残り、透明効果を作成できることです。

このソリューションはiOS 7以降で機能します


ご回答有難うございます。
Salman Khakwani 2016年

3

これを行う非常に簡単な方法は(Storyboardsたとえばを使用して)です。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

これは、提示するUIViewControllerStoryboardモーダルが、半透明の背景を持ちます。


3

iOS 7-10での作業

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}

2

ここですべての良い答えとコメントを要約し、新しいViewControllerものに移行するときにアニメーションを残すには、これを行いました(iOS 6以降をサポート)。

UINavigationController\ を使用している場合、UITabBarControllerこれは行く方法です:

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

そうすると、modalTransitionStyleアニメーションが失われます。それを解決するために、SomeViewControllerクラスにこれを簡単に追加できます:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}

2

もちろん、UIModalPresentationCurrentContextを設定する必要がありますが、clearColorを設定する場所も非常に重要です。viewDidLoad関数で背景を設定することはできません。ルートビューコントローラーコントローラーinit関数のように、ビューが読み込まれる前に背景を設定してください。

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

または

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}

これは、他の人の中で私を助けたヒントでした。ご協力いただきありがとうございます。
Tomasz Nazarenko、

1

モーダルセグエを使用している場合は、必ずこの画像として設定してください(必要に応じてアニメーションをオフにできます)。ここに画像の説明を入力してください


1

iOS 7およびiOS 8でテストされた完全なメソッド。

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end

1

Swift 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)

0

appdelegateで:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

次のビューをロードする必要がある場所から、最初のビューコントローラ:

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

透過的に追加されるあなたのnextViewControllerで:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}

0

ログイン画面はモーダルです。つまり、前の画面の上に表示されます。これまでのところ、背景をぼかしましたが、何もぼやけていません。背景は灰色です。

モーダルを適切に設定する必要があります。

画像リンク先

  • まず、View ControllerのViewの背景をClear colorに変更する必要があります。それは単にそれが透明でなければならないことを意味します。デフォルトでは、そのビューは白です。

  • 次に、ログイン画面につながるセグエを選択し、属性インスペクタで、プレゼンテーションを「現在のコンテキストより上」に設定する必要があります。このオプションは、自動レイアウトとサイズクラスが有効になっている場合にのみ使用できます。

画像リンク先


0

設定ナビゲーションのmodalPresentationStyleUIModalPresentationCustom

提示されたView Controllerの背景色をクリアカラーに設定します。

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