2009-09-30 4 views
7

Je voudrais créer une sous-classe UIViewController réutilisable qui peut être affichée comme un contrôleur de vue modale sur tout autre contrôleur de vue. L'une des premières choses que ce VC réutilisable doit faire est de faire apparaître une UIActionSheet. Pour ce faire, je crée une vue par défaut (vide) dans mon VC pour montrer la feuille d'action de. Cependant, cela semble mauvais parce que, lorsque le vc modal apparaît, le vc parent est caché. Ainsi, il semble que la feuille d'action flotte sur un fond blanc. Ce serait mieux si la feuille d'action pouvait apparaître sur le vc original (parent).Comment créer un UIViewController modal translucide?

Existe-t-il un moyen d'y parvenir? Est-il sûr de simplement saisir la vue du parent vc et animer le UIActionSheet de cela?

+0

ayant le même problème. Une solution? – Frade

Répondre

0

Vous pouvez simplement l'afficher sur votre contrôleur de vue parent en insérant une vue dans une vue parente.

Quelque chose comme ceci:

PseudoModalVC *vc = ...//initialization 
vc.view.backgroundColor = [UIColor clearColor]; // like in previous comment, although you can do this in Interface Builder 
vc.view.center = CGPointMake(160, -vc.view.bounds.size.height/2); 
[parentVC.view addSubView:vc.view]; 

// animation for pop up from screen bottom 
[UIView beginAnimation:nil context:nil]; 
vc.view.center = CGPointMake(160, vc.view.bounds.size.height/2); 
[UIView commitAnimation]; 
+1

Si vous faites cela, vous devrez également effectuer tous les appels appropriés à des méthodes telles que "viewWillAppear" dans le contrôleur de vue affiché. UINavigationController et le système modal s'occupent de cela normalement. – DougW

-1

Yep. Ajoutez-le à la vue du contrôleur de vue actuel (ou sous-vue de la fenêtre) et animez-le à l'écran comme le dit Valerii.

Pour l'enlever avec une animation, faites ceci (je suppose que le point de vue modal est de 320 x 460 et se glisser vers le bas de l'écran):

- (void)dismissModal 
{ 
    // animate off-screen 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationDuration:0.50]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 

    self.view.frame = CGRectMake(0, 480, 320, 460); 

    [UIView commitAnimations]; 
} 

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    // don't remove until animation is complete. otherwise, the view will simply disappear 
    [self.view removeFromSuperview]; 
} 
14

Après votre point de vue modal anime en, il est redimensionné pour être égal en taille à sa vue parente. Ce que vous pouvez faire est dans votre viewDidAppear :, prendre une photo de la vue de parentController, puis insérez un UIImageView contenant l'image du parent à l'arrière de votre propre liste de vue subviews:

#pragma mark - 
#pragma mark Sneaky Background Image 
- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    // grab an image of our parent view 
    UIView *parentView = self.parentViewController.view; 

    // For iOS 5 you need to use presentingViewController: 
    // UIView *parentView = self.presentingViewController.view; 

    UIGraphicsBeginImageContext(parentView.bounds.size); 
    [parentView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *parentViewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // insert an image view with a picture of the parent view at the back of our view's subview stack... 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
    imageView.image = parentViewImage; 
    [self.view insertSubview:imageView atIndex:0]; 
    [imageView release]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    // remove our image view containing a picture of the parent view at the back of our view's subview stack... 
    [[self.view.subviews objectAtIndex:0] removeFromSuperview]; 
} 
+1

Pour iOS 5, vous devez utiliser 'presentingViewController' au lieu de' parentViewController'. J'ai mis à jour votre réponse pour inclure cela. –

+0

Cela fonctionne principalement bien, mais quand je l'essaie, je reçois un écart de 20 px en haut de l'image de la vue parent causé (je devine) par la barre d'état. Des suggestions pour corriger cela? – Mac

+0

Mise à jour: J'ai réussi un correctif en traduisant mon contexte d'image de 20 pixels vers le haut, mais je suis toujours curieux de savoir pourquoi je dois le faire quand il semble que personne d'autre ne l'a fait? – Mac

Questions connexes