web-dev-qa-db-ja.com

UIViewController上にclearColor UIViewControllerを表示します

別の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の両方で非常にうまく機能しています。黒の背景がないModal View Controllerは、clearColor/transparentのみです。変更する必要があるのは、UIModalPresentationFullScreenUIModalPresentationCurrentContextに置き換えることだけです。なんて簡単なことでしょう!

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];

注:modalPresentationStylenavigationControllerプロパティを使用している場合:

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の問題を修正したことです!私は誰かに助けを求めましたが、ここに彼が言ったことがあります:

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

IOS7で上記の問題に対する私のソリューションが表示される場合があります。 https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions

147
hightech

解決済み:問題を修正しました。 iPhoneとiPadの両方で非常にうまく機能しています。黒の背景がないModal View Controllerは、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の問題を修正したことです!私は誰かに助けを求めましたが、ここに彼が言ったことがあります:

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

IOS7で上記の問題に対する私のソリューションが表示される場合があります。 https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions

138
hightech

iOS8 +

IOS8以降では、新しいmodalPresentationStyle UIModalPresentationOverCurrentContextを使用して、View Controllerに透明な背景を表示できます。

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

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

1。View Controllerの提示

Define context

2。提示されたView Controller

Presentation: Over Current Context

111
pasevin

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)
21
Kevin ABRIOUX

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

enter image description here

16
smileBot

IOS7およびiOS8で動作させる最も簡単な方法は、iOS8のために、modallyPresentedVC(モーダルで表示するViewController)でpresentationStyleをUIModalPresentationOverCurrentContextに追加することです。

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

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

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

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

8
3vangelos

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)
5
Mojtabye

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

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

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

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

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

4
educaPix

カスタムセグエを使用した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

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

4
Max Gribov

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

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はTransparent View Controllerであり、またMMPushNotificationViewControllerの表示色をclearcolorにしました。これですべて完了し、Transparentviewcontrollerが作成されました。

3
Manab Kumar Mal

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

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];

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

2
Elf Sundae

Works Great on 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];
2
hoppus

IOS7の場合

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

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

カスタムトランジションを作成するには、2つのものが必要です。

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

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

2
Kirualex

IOS 7の場合、Interface Builderを使用することでのみ、モーダルプレゼンテーションに関係するすべてのView Controllerでプレゼンテーションを「Over Current Context」に設定することで実現できます。 Navigation Controllerでも

たとえば、これらすべてのView Controllerで設定します:

NavController-> RootViewController-> ModalViewController

enter image description here

1
David Hernandez

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

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

0
WendiKidd