151

サブビュー/モーダルを透明にする必要があり、サブビューに追加されたコンポーネントが表示されるようにするなど、別のビューの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 Controller を使用したカスタム トランジション」の講演で概説されており、独自のトランジション デリゲートの実装方法についても説明されています。

iOS7 で上記の問題に対する私の解決策が表示される場合があります: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions

4

16 に答える 16

145

iOS8以降

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

MyModalViewController *modalViewController = [[MyModalViewController alloc] init];
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:modalViewController animated:YES completion:nil];    
于 2014-10-15T16:21:28.033 に答える
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 Controller を使用したカスタム トランジション」の講演で概説されており、独自のトランジション デリゲートの実装方法についても説明されています。

iOS7 で上記の問題に対する私の解決策が表示される場合があります: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions

于 2012-06-28T21:12:36.147 に答える
114

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

1.View Controllerの提示

コンテキストを定義する

2.View Controllerの提示

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

于 2014-12-15T15:09:56.040 に答える
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)
于 2016-11-28T10:22:29.747 に答える
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)
于 2016-01-03T15:49:39.910 に答える
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

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

于 2014-08-10T15:40:18.033 に答える
4

別の方法 (カスタム トランジションを作成する必要はなく、iOS 7 で動作します)

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

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

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

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

于 2013-12-11T19:12:45.213 に答える
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ビューの色を clearcolor にしました。これで、すべて完了し、Transparentviewcontroller を作成しました。

于 2015-01-12T14:24:39.710 に答える
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];

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

于 2013-04-24T18:27:15.247 に答える
2

iOS7およびiOS8素晴らしい動作

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];
于 2015-02-06T12:36:07.157 に答える
0

私は Storyboard/Interface builder をあまりいじっていませんが、私が思いついたのは、ビューに透明な色 (つまり、100% アルファ/シースルー) を指定し、不透明にするように指定していることです ( 0% アルファ - 完全に固体)。この二つは噛み合わないようです。行をコメントアウトして、self.view.opaque = YES;それが機能するかどうかを確認します;)

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

于 2012-06-28T00:28:00.323 に答える