UIViewControllerの上にclearColor UIViewControllerを表示します


150

私はUIViewControllerのようにビューをサブビュー/モーダル別の上UIViewController図は、そのようなものとサブビュー/モーダル透明であるべきであり、どのコンポーネントが見えるはずサブビューに追加されます。問題は、サブビューがclearColorを持つ代わりに黒の背景を表示することです。私はUIView黒の背景ではなくclearColor として作ろうとしています。誰かがそれの何が悪いのか知っていますか?どんな提案も歓迎します。

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:NO];  

SecondViewController.m

- (void)viewDidLoad 
{
     [super viewDidLoad];
     self.view.opaque = YES;
     self.view.backgroundColor = [UIColor clearColor];
}

解決済み:問題を修正しました。iPhoneとiPadの両方でうまく機能しています。黒い背景のないモーダルビューコントローラーは、clearColor / transparentです。変更する必要があるのは、に置き換えるUIModalPresentationFullScreenことだけUIModalPresentationCurrentContextです。とても簡単です。

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

注意:次のmodalPresentationStyleプロパティを使用している場合navigationController

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

注意:悪いニュースは、上記のソリューションがiOS 7では機能しないことです。良いニュースは、iOS7の問題を修正したことです!私は誰かに助けを求めました、そして彼が言ったことはここにあります:

ビューコントローラーをモーダルで表示する場合、iOSは、表示されている間、その下のビューコントローラーをビュー階層から削除します。モーダルに表示されたビューコントローラーのビューは透明ですが、その下には黒いアプリウィンドウ以外はありません。iOS 7では、新しいモーダルプレゼンテーションスタイルが導入されましたUIModalPresentationCustom。これにより、iOSは表示されたビューコントローラーの下のビューを削除しません。ただし、このモーダルプレゼンテーションスタイルを使用するには、プレゼンテーションを処理してアニメーションを閉じるための独自の遷移デリゲートを提供する必要があります。これは、WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218の「View Controllersを使用したカスタムトランジション」の講演で概説されており、独自のトランジションデリゲートの実装方法についても説明しています。

iOS7で上記の問題の私の解決策を見ることができます:https : //github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


1
rootViewControllerのmodalPresentationStyleを設定してください。そうしないと機能しません
Thorsten

この回答にコメントを見てくださいstackoverflow.com/a/25990081/1418457を、それが動作します
onmyway133

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

self.modalPresentationStyle = UIModalPresentationCurrentContextを実行する必要がありました。提示されたビューコントローラではなく、提示されたビューコントローラを使用して機能させます。
タレブ2015

1
以下のBrodyの回答を確認してください。modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; 問題を解決します
GoodSp33d 2015

回答:


143

iOS8以降

iOS8以降では、新しいmodalPresentationStyle UIModalPresentationOverCurrentContextを使用して、透明な背景を持つビューコントローラーを表示できます。

MyModalViewController *modalViewController = [[MyModalViewController alloc] init];
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:modalViewController animated:YES completion:nil];    

5
受け入れられる答えでなければなりません。以前に受け入れられた回答はレガシーの理由でまだ有効ですが、これは推奨される方法です。
TomaszBąk2015

3
iOS 8のみを対象に開発している場合は、この答えを使用してください。動作します
マリオカルバーリョ

2
これは良いですが、最後の行はそうではありません[self presentViewController:modalViewController animated:YES completion:nil];か?(targetControllerの代わりに)?
SuperDuperTango 2015

3
これを私のために機能させるために、解決策のおかげでmodalViewController.view.backgroundColor = UIColor.clearColor()を追加しました
Pramod

誰もが私にpushviewcontrollerのコードを提供してもらえますか(ナビゲーションコントローラーの意味です)。
Alok、2015

140

解決済み:問題を修正しました。iPhoneとiPadの両方でうまく機能しています。黒い背景のないモーダルビューコントローラーは、clearColor / transparentです。変更する必要があるのは、UIModalPresentationFullScreenをUIModalPresentationCurrentContextに置き換えたことだけです。とても簡単です。

FirstViewController.m

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:vc animated:NO completion:nil];

注意: navigationControllerのmodalPresentationStyleプロパティを使用している場合:

FirstViewController.m

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:vc animated:NO completion:nil];

注意:悪いニュースは、上記のソリューションがiOS 7では機能しないことです。良いニュースは、iOS7の問題を修正したことです!私は誰かに助けを求めました、そして彼が言ったことはここにあります:

ビューコントローラーをモーダルで表示する場合、iOSは、表示されている間、その下のビューコントローラーをビュー階層から削除します。モーダルに表示されたビューコントローラーのビューは透明ですが、その下には黒いアプリウィンドウ以外はありません。iOS 7では、新しいモーダルプレゼンテーションスタイルUIModalPresentationCustomが導入されました。これにより、iOSは表示されたビューコントローラーの下のビューを削除しません。ただし、このモーダルプレゼンテーションスタイルを使用するには、プレゼンテーションを処理してアニメーションを閉じるための独自の遷移デリゲートを提供する必要があります。これは、WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218の「View Controllersを使用したカスタムトランジション」の講演で概説されており、独自のトランジションデリゲートの実装方法についても説明しています。

iOS7で上記の問題の私の解決策を見ることができます:https : //github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


1
self.modalPresentationStyle = UIModalPresentationCurrentContext;それをやった。
Adriano Lucas

4
btw .. self.modalPresentationStyle = UIModalPresentationCurrentContext; modalViewControllerにアニメーションを表示していません。
Devarshi

1
@Miraaj次に、UIViewControllerを表示する前にmodalPresentationStyleをUIModalPresentationFullScreenに設定してくださいself.modalPresentationStyle = UIModalPresentationFullScreen; [self performSegueWithIdentifier:@"CustomSegue" sender:self];
hightech

1
iOS 6と7でこれを実行すると、プレゼンテーションをアニメーション化している間、新しいビューコントローラーはクリアになりますが、配置すると、背景が黒くなります。解雇をアニメートすると、再びクリアになります。他に誰かがこの問題を抱えていましたか?
ドリューC

3
@pkamb私は、iOS 7のためのソリューション更新stackoverflow.com/a/11252969/1344459あなたを助けI希望を。
ハイテク2013年

114

したがって、純粋に視覚的な思想家やストーリーボードファンには、次のことができます。

1. View Controllerの提示

コンテキストを定義する

2.提示されたView Controller

プレゼンテーション:現在のコンテキストについて


これは受け入れられる答えになるはずです。これが機能するために行う必要があるのはこれだけであり、モーダルコントローラのビューの背景色をクリアに設定します。
ジェシー

この場合、合意されたストーリーボードオプションによってコードが上書きされます。
C0D3 2016

17
この答えはとても甘い、私は今糖尿病にかかっています。
GeneCode

25

Swift 3およびiOS10ソリューション:

//create view controller
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "RoadTripPreviewViewController")
//remove black screen in background
vc.modalPresentationStyle = .overCurrentContext
//add clear color background
vc.view.backgroundColor = UIColor.clear
//present modal
self.present(vc, animated: true, completion: nil)

16

これは、コントロールドラッグセグエを使用したxCode 7ベータ4からです。目的地の背景をクリアに設定し、IBのセグエプロパティを次のように設定するだけです(nb。プレゼンテーションを「全画面表示」にすることもできます)。

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


2
ありがとうございました。私はあなたのセグエ修正+ @pasevinによるViewControllers回答を行いました、そしてそれはうまくいきました!!
CSawy

1
これは私の質問に答えました。どうもありがとうございました。賛成票をお
持ちください

8

iOS7とiOS8で機能させる最も簡単な方法は、iOS8のために、modallyPresentedVC(モーダルに表示したいViewController)のプレゼンテーションスタイルをUIModalPresentationOverCurrentContextに追加することです。

[modallyPresentedVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[modallyPresentedVC.navigationController setModalPresentationStyle:UIModalPresentationOverCurrentContext];

iOS7のため、presentingVC(modallyPresentedを提示するコントローラー)のUIModalPresentationCurrentContext:

[presentingVC setModalPresentationStyle:UIModalPresentationCurrentContext];
[presentingVC.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];

iOS7とiOS8では処理が異なるためです。もちろん、navigationControllerプロパティを使用していない場合は、設定する必要はありません。お役に立てば幸いです。


ベーコンを救った!ありがとう
ダック

5

Swift2バージョン:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController
vc.view.backgroundColor = UIColor.clearColor()
vc.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen // orOverCurrentContext to place under navigation
self.presentViewController(vc, animated: true, completion: nil)

4

別の方法(カスタム遷移を作成する必要はなく、iOS 7で動作します)

ストーリーボードの使用:

自由サイズの子ビューコントローラを作成し、ビューの幅を500x500(たとえば)に設定して、次のメソッドを追加します。

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    self.view.superview.bounds = CGRectMake(0, 0, 500, 500);
    self.view.superview.backgroundColor = [UIColor clearColor];
}

次に、フォームシートを使用してモーダルセグエを作成し、テストします。


あなたは素晴らしいです!!! これは実際に動作します!!! (IBで「自由」サイズを設定しても、シミュレートされたメトリックであるという理由で影響はありませんが、とにかく機能します!!!)そして、とても簡単です!!!
Radu Simionescu、2014年

4

カスタムセグエを使用したiOS 7ソリューション:

CustomSegue.h
#import <UIKit/UIKit.h>

    @interface CustomSegue : UIStoryboardSegue <UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>

    @end



CustomSegue.m
#import "CustomSegue.h"

@implementation CustomSegue

-(void)perform {

    UIViewController* destViewController = (UIViewController*)[self destinationViewController];
    destViewController.view.backgroundColor = [UIColor clearColor];
    [destViewController setTransitioningDelegate:self];
    destViewController.modalPresentationStyle = UIModalPresentationCustom;
    [[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];
}


//===================================================================
// - UIViewControllerAnimatedTransitioning
//===================================================================

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

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {

    UIView *inView = [transitionContext containerView];
    UIViewController* toVC = (UIViewController*)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromVC = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [inView addSubview:toVC.view];

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    [toVC.view setFrame:CGRectMake(0, screenRect.size.height, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];

    [UIView animateWithDuration:0.25f
                     animations:^{

                         [toVC.view setFrame:CGRectMake(0, 0, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];
                     }
                     completion:^(BOOL finished) {
                         [transitionContext completeTransition:YES];
                     }];
}


//===================================================================
// - UIViewControllerTransitioningDelegate
//===================================================================

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {

    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    //I will fix it later.
    //    AnimatedTransitioning *controller = [[AnimatedTransitioning alloc]init];
    //    controller.isPresenting = NO;
    //    return controller;
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

@end

ハイテクコードに基づくソリューション。


私が[self dismissViewControllerAnimated:YES completion:NULL]を閉じると、例外が発生しますか?
アサドゥラアリ

はい、このコードについては。または、アニメーションを開始するためにanimationControllerForDismissedControllerメソッドを実装する必要があります。
Max Gribov、2015

4

私にとってこれは機能します:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MMPushNotificationViewController"];

    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
#ifdef __IPHONE_8_0
    if(IS_OS_8_OR_LATER)
    {
        self.providesPresentationContextTransitionStyle = YES;
        self.definesPresentationContext = YES;
        [vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    }
#endif


    [self presentViewController:vc animated:NO completion:nil];

MMPushNotificationViewControllerは透明ビューコントローラーです。また、MMPushNotificationViewControllerのビューの色をクリアカラーにしています。これで完了です。Transparentviewcontrollerを作成しました。


2

iOS7の場合

これで、iOS7のカスタムトランジションを使用してこれを実現する方法があります。

MyController * controller = [MyController new];
[controller setTransitioningDelegate:self.transitionController];
controller.modalPresentationStyle = UIModalPresentationCustom;
[self controller animated:YES completion:nil];

カスタム遷移を作成するには、2つのものが必要です。

  • TransitionDelegateオブジェクト(実装 <UIViewControllerTransitionDelegate>
  • 「AnimatedTransitioning」オブジェクト(実装<UIViewControllerAnimatedTransitioning>

カスタムトランジションの詳細については、このチュートリアルをご覧ください。


アニメータークラスにmainviewcontrollerと2番目のビューコントローラークラスを追加した具体的な理由はありますか?UIViewController * toVC =(UIViewController *)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];を直接使用しなかった理由 UIViewController * fromVC =(UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
Satyam Raikar 2014

これは私のチュートリアルではないので、これについての詳細はわかりません。あなたのポイントは有効なようですが。
Kirualex、2014

2

素晴らしい作品iOS7iOS8

UIViewController* vc=[[UIViewController alloc]initWithNibName:@"VC" bundle:nil];

vc.view.alpha=0.7;
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:vc animated:NO completion:nil];

2番目のベストアンサーの複製。
TomaszBąk2015

2

ウィンドウをビューに「再追加」することもできます。

OneViewController *vc = [[OneViewController alloc] init];
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
    [self presentViewController:vc animated:YES completion:nil];
} else {
    [self presentModalViewController:vc animated:YES];
}

[[[UIApplication sharedApplication] keyWindow] insertSubview:self.view atIndex:0];

このようにして、プレゼンテーションをアニメーション化できます。


1

iOS 7の場合、Interface Builderを使用することによってのみ、モーダルプレゼンテーションに関連するすべてのビューコントローラーでプレゼンテーションを「Over Current Context」に設定することで実現できます。ナビゲーションコントローラーにも。

たとえば、次のすべてのView Controllerで設定します。

NavController-> RootViewController-> ModalViewController

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


0

私はStoryboard / Interface Builderをあまりいじりませんでしたが、私が思い浮かんだのは、ビューをクリアカラー(つまり、100%アルファ/シースルー)にするように指示し、不透明(アルファ0%-完全に固体)。これらの2つは一致していないようです。私はそのself.view.opaque = YES;行をコメントアウトして、それが機能するかどうかを確認します;)

ああ、私が考えたばかりの何か-あなたのビューコントローラーがアルファ背景を持っていることは完全に可能ですが、もちろん、アルファはプログラムのベースウィンドウまたはルートビューコントローラーの色まで表示されます。デフォルトは黒。アプリ全体の非常に基本的なレイヤーは、背景を透明にすることはできません-何に対して透明ですか?その背後にあるものは何ですか?透明性を通して見るものがあるはずです。それは理にかなっていますか?


self.view.opaque = YESをコメントアウトしようとしました。ラインとそれが機能していません。:-(
hightech

私の答えの後半を読みましたか?設定によっては、必要な操作を実行できない場合があります。clearColor VCの背後に何を配置しますか?多分私たちはこれを整理することができます^^
WendiKidd

-3

プレゼンテーションビューで「self.modalPresentationStyle = UIModalPresentationCurrentContext;」を使用するだけです

うまくいきます:)


1
これは、既存の回答がすでに言っていることを繰り返すだけです。
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.