通过UIViewController显示clearColor UIViewController

我有一个UIViewController视图作为一个子视图/模式在另一个UIViewController视图的顶部,如子视图/模式应该是透明的,任何组件添加到子视图应该是可见的。 问题是,我已经是子视图显示黑色背景,而不是有clearColor。 我试图使UIView作为clearColor不是黑色的背景。 有人知道它有什么问题吗? 任何build议表示赞赏。

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 /透明。 唯一需要改变的是我将UIModalPresentationFullScreenreplace为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]; 

注意:如果使用navigationControllermodalPresentationStyle属性:

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

注意:坏消息是上述解决scheme在iOS 7上不起作用。好消息是我解决了iOS7的问题! 我问了一个人的帮助,他说的是:

当以模态方式呈现视图控制器时,iOS会在视图控制器呈现的持续时间内从视图层次结构中删除其下的视图控制器。 虽然你的模式化的视图控制器的视图是透明的,除了应用程序窗口,它是黑色的,它下面没有任何东西。 iOS 7引入了一种新的模式演示风格UIModalPresentationCustom ,它导致iOS不删除所呈现的视图控制器下方的视图。 但是,为了使用这种模式演示风格,您必须提供您自己的转换委托来处理演示文稿并closuresanimation。 这在WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218的“使用视图控制器的自定义转换”中进行了概述,其中还介绍了如何实现自己的转换代理。

你可能会看到我的解决scheme在iOS7中的上述问题: https : //github.com/hightech/iOS-7-Custom-ModalViewController-Transitions

解决 :我解决了这个问题。 iPhone和iPad的效果都非常好。 没有黑色背景的模式视图控制器只是clearColor /透明。 唯一需要改变的是我将UIModalPresentationFullScreenreplace为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]; 

注意:坏消息是上述解决scheme在iOS 7上不起作用。好消息是我解决了iOS7的问题! 我问了一个人的帮助,他说的是:

当以模态方式呈现视图控制器时,iOS会在视图控制器呈现的持续时间内从视图层次结构中删除其下的视图控制器。 虽然你的模式化的视图控制器的视图是透明的,除了应用程序窗口,它是黑色的,它下面没有任何东西。 iOS 7引入了一种新的模式演示风格UIModalPresentationCustom,它导致iOS不删除所呈现的视图控制器下方的视图。 但是,为了使用这种模式演示风格,您必须提供您自己的转换委托来处理演示文稿并closuresanimation。 这在WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218的“使用视图控制器的自定义转换”中进行了概述,其中还介绍了如何实现自己的转换代理。;

你可能会看到我的解决scheme在iOS7中的上述问题: https : //github.com/hightech/iOS-7-Custom-ModalViewController-Transitions

iOS8上+

在iOS8 +中,您现在可以使用新的modalPresentationStyle UIModalPresentationOverCurrentContext来呈现具有透明背景的视图控制器:

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

所以对于纯粹的视觉思想家和故事板迷来说,你可以这样做:

1.呈现视图控制器

定义上下文

提出视图控制器

演示文稿:过度上下文

这是从xCode 7 beta 4使用控件拖拽segue。 简单地设置您的目的地的背景清除,并在IB中设置segue属性(nb。演示文稿也可以是“全屏幕”):

在这里输入图像说明

我发现让它在iOS7和iOS8上工作的最简单的方法是添加设置presentationStyle到UIModalPresentationOverCurrentContext的modallyPresentedVC(你想呈现的模式的ViewController),因为iOS8:

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

和UIModalPresentationCurrentContext在呈现VC(控制器呈现模态表示),因为iOS7:

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

因为事情在iOS7和iOS8上的处理方式不同。 当然,如果您不使用navigationController属性,则不需要设置navigationController属性。 希望有所帮助。

另一种方式(无需创build自定义过渡并在iOS 7上运行)

使用故事板:

创build具有自由大小的子视图控制器,将视图宽度设置为500×500(例如)并添加下一个方法:

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

然后用Form Sheet创build一个Modal segue并testing它。

具有自定义segue的iOS 7解决scheme:

 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 

基于高科技代码的解决scheme。

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) 

对于iOS7

现在有一种方法可以实现这一点,使用iOS7自定义转换,这样:

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

要创build您的自定义过渡,您需要2件事情:

  • 一个TransitionDelegate对象(实现<UIViewControllerTransitionDelegate>
  • 一个“AnimatedTransitioning”对象(实现<UIViewControllerAnimatedTransitioning>

您可以在本教程中find更多关于自定义转换的信息。

对我来说这个作品:

 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。

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

您也可以将窗口重新添加到视图。

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

以这种方式,呈现可以是animation。

Swift 3和iOS10解决scheme:

 //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) 

对于iOS 7,只有通过使用Interface Builder,可以通过在模态演示中涉及的所有视图控制器上将演示文稿设置为“Over Current Context”来完成。 即使对于导航控制器。

例如,在所有这些视图控制器上进行设置:

NavController – > RootViewController – > ModalViewController

在这里输入图像说明

我还没有玩过Storyboard / Interface builder,但是popup来的是,你告诉视图是清晰的(即100%alpha /透明),并告诉它是不透明的0%α – 完全固体)。 这两件事似乎没有网格。 我会注释掉self.view.opaque = YES; 行,看看它是否工作,然后;)

啊,我刚刚想到的其他东西 – 它完全可能是你的视图控制器有alpha背景,但当然alpha将显示通过程序的基本窗口或根视图控制器的颜色,这是通过默认黑色。 你的整个应用程序的基础层不能有一个透明的背景 – 对什么透明? 它背后是什么? 通过透明度必须有一些东西可以看到。 那有意义吗?

只需使用“self.modalPresentationStyle = UIModalPresentationCurrentContext;”,在呈现视图

将工作好:)