Seguente personalizzato Spinging / Poping Uiviewcontrollers
-
14-11-2019 - |
Domanda
Sto cercando di implementare una transizione flip simile a IBooks come uno storyboard.Il segue dovrebbe spingere resp.Pop il destinationViewController
su / dalla pila di uinavigationcontrollers.
Posso spingere i viewControllers nel mio metodo perform
Segues ma non sono in grado di pop.Quando pop il controller subito dopo aver creato la mia animazione flip, l'animazione non funziona e il suo callback, che dovrebbe eseguire [[UIApplication sharedApplication] endIgnoringInteractionEvents]
non viene mai chiamato e i miei risultati dell'app morti.
Così ho provato a spingere / pop nel metodo Delegate animationDidStop:anim:flag
ma non viene mai chiamato con il flag impostato su TRUE.
Suppongo che il seguisca sia deallocato prima che il metodo delegato venga chiamato.Cos'altro potrei fare?
Soluzione
Perdonami Se sono completamente fraintendendo questa domanda, ma sembra che tu voglia solo fare un flip orizzontale di base avanti e indietro tra due controller di visualizzazione. E anche se lo hai già capito, forse aiuterà chiunque altro abbia la stessa domanda.
(1) Nello Storyboard (che ha ViewController A & B) Creare un segu-Modal da A a B. Dai un identificatore (ShowviewControllerb) e scegliere Transizione: Flip orizzontale.
Impostiamo il protocollo e i delegati:
(2a) in viewcontrollerb.h Aggiungere sopra @interface:
.
@class ViewControllerB;
@protocol ViewControllerBDelegate
- (void)viewControllerBDidFinish:(ViewControllerB *)controller;
@end
(2b) Aggiungi il delegato come proprietà:
.
@property (weak, nonatomic) id <ViewControllerBDelegate> delegate;
(3a) in viewcontrollerb.m Sintetize:
.
@synthesize delegate;
(3b) e delegato nel metodo per rovesciare:
.
- (IBAction)flipBack:(id)sender
{
[self.delegate viewControllerBDidFinish:self];
}
(4) in ViewControllera.h Aggiungi all'inizio #import "ViewControllerB.h"
e alla fine di @interface <ViewControllerBDelegate>
(5a) in viewcontrollera.m Aggiungere il metodo per conformare al protocollo:
.
- (void)viewControllerBDidFinish:(ViewControllerB *)controller
{
[self dismissModalViewControllerAnimated:YES];
}
(5b) quindi impostalo come Delegato in PreseForseGue:
.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showViewControllerB"]) {
[[segue destinationViewController] setDelegate:self];
}
}
Spero che questo risponda alla tua domanda. Se ho frainteso, fammelo sapere.
Altri suggerimenti
La tua domanda è un po 'confusa come così mescolando Pop, spingere, flip e backflip. Non sono sicuro che Ai possa rispondere alla tua domanda, ma posso dire cosa ho fatto.
Se spingo un viewcontroller nello stack del controller di navigazione e impostare lo stile Segue Storyboard per spingere, verrà spinto nella vista da destra a sinistra. Viene visualizzato un pulsante Indietro e mostra il titolo del presentingViewController in esso.
Se ho impostato lo stile segue dello storyboard in moda, posso impostare la transizione per capovolgere orizzontale (ciò che sembra essere ciò che vuoi). Ma poi non apparirà il pulsante Indietro. Nel presenzedviewcontroller, respingere la vista con:
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
.
capovolgerà la seconda vista con un flip destro.
Ma questa è la soluzione sporca e non è raccomandata da Apple.
Luke Dubert ti ha dato un esempio come implementare il delegato.