5

Sto facendo un gioco iOS e voglio ottenere questo effetto: pause popup 2 different controllersCome creare una vista popup/dialog in iOS in un ViewController separato?

So come farlo utilizzando uno View Controller, ma la mia classe di visualizzazione del controller è già gonfio di codice e lo storyboard di quello schermo è un casino (in realtà ho molte più viste che l'immagine sopra, le ho solo nascoste per motivi di chiarezza).

Quindi le mie domande sono: esiste un modo per ottenere ciò utilizzando un controller di visualizzazione separato per gestire questo popover di pausa? Ho bisogno di un seguito che non eliminerà lo schermo presentato in precedenza. Voglio farlo usando gli storyboard. Ho provato "popover" segue ma è apparso con un bordo strano che non voglio.

Inoltre, ho bisogno che tutti i controlli che non sono gestiti dal controller della vista di pausa smettano di ascoltare gli eventi. Ho pensato di usare una vista trasparente nera che copre l'intero schermo come BG per la vista di pausa e far sì che ignori gli eventi. C'è un approccio migliore?

Grazie in anticipo.

risposta

16

Se si vuole raggiungere utilizzando storyboard, è abbastanza semplice.

ho allegare example code

1 - Crea il tuo PauseViewController personalizzata in Storyboard. Utilizza una visualizzazione a schermo intero, di colore nero, con Alpha 0 e una sottoview contenente i controlli di pausa. Creare i file .h e .m corrispondenti

2 - aggiungere e collegare i controlli (UIButtons). Aggiungi un metodo di rimozione come questo. Questo metodo rimuoverà la vista dalla gerarchia e renderla non visibile cambiando l'alpha in congedo.

- (IBAction)dismiss:(id)sender { 
    [UIView animateWithDuration:0.3f animations:^{ 
     self.view.alpha = 0.0f; 
    } completion:^(BOOL finished) { 
     [self.view removeFromSuperview]; 
     [self removeFromParentViewController]; 
    }]; 
} 

3 - sottoclasse UIStoryboardSegue creare la propria classe seguito. Quindi, sovrascrivere il metodo perform con qualcosa di simile. Ciò prende semplicemente i due controller (sorgente e destinazioni) e posiziona la vista di destinazione sulla vista sorgente con un'animazione.

-(void)perform{ 
    UIViewController *dst = [self destinationViewController]; 
    UIViewController *src = [self sourceViewController]; 

    // add the view to the hierarchy and bring to front 
    [src addChildViewController:dst]; 
    [src.view addSubview:dst.view]; 
    [src.view bringSubviewToFront:dst.view]; 

    // set the view frame 
    CGRect frame; 
    frame.size.height = src.view.frame.size.height; 
    frame.size.width = src.view.frame.size.width; 
    frame.origin.x = src.view.bounds.origin.x; 
    frame.origin.y = src.view.bounds.origin.y; 
    dst.view.frame = frame; 

    [UIView animateWithDuration:0.3f animations:^{ 
     dst.view.alpha = 0.5f; 
    }]; 
} 

4 - collegare il tuo segue, scegliere personalizzato e inserire il nome della classe segue personalizzato.

Ta-daaaa!

Se sono necessari altri dettagli, controllare il codice di esempio o aggiungere un commento.

+0

Questo è più simile alla creazione di un controller contenitore. Non è necessario farlo quando ios ti ha fornito il controller del contenitore. Vedere la mia risposta sotto –

+0

Ha chiesto specificamente per una soluzione personalizzata seguita. Questo è pulito e riutilizzabile: può attivare il seguito da qualsiasi viewController (se necessario), oppure può riutilizzare solo i passaggi personalizzati per presentare altri vc. separa la parte dell'animazione (la transizione del seguito) dal codice del controller. La separazione è la chiave per un codice più pulito e gestibile. – LombaX

+0

Per essere più chiaro, ha chiesto a qualcosa di non essere incorporato nella scena originale, per evitare di complicarlo di più. Così ha messo una restrizione sulle possibili soluzioni. Altrimenti, la soluzione più semplice sarebbe stata quella di aggiungere solo una sottoview (non un'intera vc) e mostrare/nascondere quando necessario. – LombaX

2

Si dovrebbe esaminare childViewControllers. Sembra che tu voglia raggiungere qualcosa come questo.

PauseMenuViewController *pauseMenuVC = [[PauseMenuViewController alloc] init]; 
[self addChildViewController:pauseMenuVC]; 
if ([self isViewLoaded]){ 
    [self.view addSubview:pauseMenuVC.view]; 
} 

Si dovrebbe essere in grado di creare il proprio animazioni del menu entrare la vista e oscuramento lo sfondo.

Apple Docs

0

Supponendo che non si stia utilizzando la scena di cocos 2d. In iOS semplice, la migliore soluzione possibile è l'utilizzo del contenitore Controller.

  1. andare al vostro story board e trascinare un controller contenitore per il vostro controller della vista principale (proprio come si trascina un UILabel)
  2. Impostare le dimensioni del contenitore. Un'altra vista incorporata uscirà dal controller contenitore della stessa dimensione. Assegna a questo controller di visualizzazione un nuovo nome di classe.
  3. fare una presa per contenitore e mostrare/nascondere contenitore come richiesto.

Se non si riesce a farlo, farò un tutorial su questo sito. Commenta qui sotto se vuoi che lo faccia.

+0

sto lavorando su un semplice proj, vorrei creare un controller contenitore e caricare una pagina html5 così da potermi aiutare, ho qualche exp in html 5 ma non in ios dev, quindi potresti aiutami con un semplice esempio o tutorial. – dreamweiver

0

Come variante della risposta relativa alla sottoclasse UIStoryboardSegue, è possibile utilizzare anche un'immagine trasparente 1x1 "blank.png". In questo modo avresti solo bisogno di occuparti degli alfa delle sottoview del controller di visualizzazione del popup, in modo che il popup nel mezzo possa avere una visibilità completa se lo desideri.

-(void)perform 
    { 
     UIViewController *dst = [self destinationViewController]; 
     UIViewController *src = [self sourceViewController]; 

     // add the view to the hierarchy and bring to front 
     [src addChildViewController:dst]; 
     [src.view addSubview:dst.view]; 
     [src.view bringSubviewToFront:dst.view]; 

     // set the view frame 
     CGRect frame; 
     frame.size.height = src.view.frame.size.height; 
     frame.size.width = src.view.frame.size.width; 
     frame.origin.x = src.view.bounds.origin.x; 
     frame.origin.y = src.view.bounds.origin.y; 
     dst.view.frame = frame; 
     dst.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"blank.png"]]; 

     [UIView animateWithDuration:0.3f animations:^{ 
      dst.view.alpha = 1; 
     }]; 
    }