iphone without - Afficher clearColor UIViewController sur UIViewController




storyboard instantiate (14)

Vous pouvez également "rajouter" la fenêtre à la vue.

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

Et de cette manière, la présentation peut être animée.

J'ai une vue UIViewController tant que sous-vue / modal au-dessus d'une autre vue UIViewController , par exemple que la sous-vue / modale devrait être transparente et que tous les composants ajoutés à la sous-vue devraient être visibles. Le problème est que j'ai la sous-vue montre fond noir à la place d'avoir clearColor. J'essaie de faire de UIView un clearColor non noir. Est-ce que quelqu'un sait ce qui ne va pas? Toute suggestion appréciée.

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

RÉSOLU : J'ai corrigé les problèmes. Il fonctionne si bien pour iPhone et iPad. Modal View Controller sans fond noir juste clearColor / transparent. La seule chose que j'ai besoin de changer est de remplacer UIModalPresentationFullScreen par UIModalPresentationCurrentContext . Comme c'est simple!

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

AVIS: Si vous utilisez une propriété modalPresentationStyle de 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];

AVIS: La mauvaise nouvelle est que la solution ci-dessus ne fonctionne pas sur iOS 7. Les bonnes nouvelles sont que j'ai corrigé le problème pour iOS7! J'ai demandé de l'aide à quelqu'un et voici ce qu'il a dit:

Lorsque vous présentez un contrôleur de vues de manière modale, iOS supprime les contrôleurs de vue situés en dessous de la hiérarchie de vue pendant la durée de la présentation. Alors que la vue de votre contrôleur de vue modulaire est transparente, il n'y a rien en dessous, sauf la fenêtre de l'application, qui est noire. iOS 7 a introduit un nouveau style de présentation modale, UIModalPresentationCustom , qui UIModalPresentationCustom iOS de supprimer les vues sous le contrôleur de vue présenté. Toutefois, pour utiliser ce style de présentation modale, vous devez fournir votre propre délégué de transition pour gérer la présentation et ignorer les animations. Ceci est décrit dans la présentation «Transitions personnalisées à l'aide des contrôleurs de vue» de la WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218 qui décrit également comment implémenter votre propre délégué de transition.

Vous pouvez voir ma solution pour le problème ci-dessus dans iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


Je n'ai pas beaucoup joué avec Storyboard / Interface Builder, mais ce qui me vient à l'esprit, c'est que vous dites que l'affichage doit être clair (c'est-à-dire 100% alpha / transparent) et aussi qu'il est opaque ( 0% alpha - complètement solide). Ces deux choses ne semblent pas s'entremêler. Je commenterais le self.view.opaque = YES; ligne et voir si cela fonctionne alors;)

Ah, quelque chose d'autre que je viens de penser - il est tout à fait possible que votre contrôleur de vue a le fond alpha, mais bien sûr l'alpha montrera à la couleur de la fenêtre de base ou contrôleur de vue racine du programme, qui est noir par défaut. La couche de base de l'ensemble de votre application ne peut pas avoir un arrière-plan transparent - transparent à quoi? Qu'y a-t-il derrière? Il doit y avoir quelque chose à voir à TRAVERS la transparence. Cela a-t-il du sens?


iOS 7 avec solution personnalisée:

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

Solution basée sur un code high-tech.


Une autre façon (pas besoin de créer une transition personnalisée et fonctionne sur iOS 7)

Utilisation de Storyboard:

Créez le contrôleur de vue enfant avec la taille de liberté, définissez la largeur de vue à 500x500 (par exemple) et ajoutez la méthode suivante:

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

Créez ensuite une section modale avec la feuille de formulaire et testez-la.


J'ai trouvé le moyen le plus simple de le faire fonctionner sur iOS7 et iOS8 est d'ajouter set presentationStyle à UIModalPresentationOverCurrentContext sur le modallyPresentedVC (ViewController que vous souhaitez présenter de manière modale) à cause de iOS8:

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

et UIModalPresentationCurrentContext sur presentationVC (le contrôleur qui présente le modallyPresented) à cause de iOS7:

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

Parce que les choses sont traitées différemment sur iOS7 et iOS8. Bien sûr, vous n'avez pas besoin de définir les propriétés navigationController si vous n'en utilisez pas. J'espère que cela pourra aider.


Fonctionne très bien sur iOS7 et 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];

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

Pour moi cela fonctionne:

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 est le contrôleur Transparent View et j'ai également rendu la MMPushNotificationViewController la vue de MMPushNotificationViewController en tant que clearcolor. Maintenant tout ce que j'ai fait et fait mon contrôleur transparent.


Donc, pour les penseurs purement visuels et les fans de storyboard, vous pouvez faire:

1. Présentation du contrôleur de vue

2. Contrôleur de vue présenté


Pour iOS 7 et uniquement en utilisant Interface Builder, il est possible de définir la présentation sur "Over Current Context" sur tous les contrôleurs de vue impliqués dans la présentation modale. Même pour les contrôleurs de navigation.

Par exemple, définissez-le sur tous ces contrôleurs de vue:

NavController -> RootViewController -> ModalViewController


Pour iOS7

Il y a maintenant un moyen d'y parvenir en utilisant les transitions personnalisées iOS7, de cette façon:

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

Pour créer votre transition personnalisée, vous avez besoin de 2 choses:

  • Un objet TransitionDelegate (implémentation de <UIViewControllerTransitionDelegate> )
  • Un objet "AnimatedTransitioning" (implémentation de <UIViewControllerAnimatedTransitioning> )

Vous trouverez plus d'informations sur les transitions personnalisées dans ce tutorial .


iOS8 +

Dans iOS8 +, vous pouvez maintenant utiliser le nouveau modalPresentationStyle UIModalPresentationOverCurrentContext pour présenter un contrôleur de vue avec un arrière-plan transparent:

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

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

ajoutez simplement " • "

Même je cherchais quelque chose comme ça pour mon textView . Ce que j'ai fait, il suffit d'ajouter une chaîne ci-dessus avec ma chaîne et de la passer à mon textView , même chose pour les labels aussi.

J'ai répondu à cela pour le futur Viewer.







iphone objective-c ios uiviewcontroller storyboard