Domanda

Ho un pulsante personalizzato su un controller di visualizzazione nella gerarchia del controller di navigazione, che quando viene premuto, apre il controller di visualizzazione visibile.

Voglio usare UIView transform proprietà per animare la chiusura del controller della vista.Funziona, ma se utilizzo `popViewControllerAnimated:YES', la diapositiva sinistra predefinita dell'animazione è ancora lì, sebbene funzioni anche la mia trasformazione personalizzata.

Se imposto popViewControllerAnimated:NO non anima assolutamente nulla.

Ho anche esaminato l'utilizzo CATransition che funziona quando ho popViewControllerAnimated impostato NO, ma non esiste un effetto "zoom" che faccia parte dell'API pubblica e non voglio utilizzare l'effetto privato.Inoltre, i filtri personalizzati non sono disponibili per iPhone, solo per OS X.

Quindi immagino che le mie domande siano:

1) Esiste un modo per rimuovere la diapositiva sinistra nella transizione predefinita pur mantenendo un'animazione personalizzata transform?

2) Un modo per utilizzare un filtro personalizzato per CATransition?

3) Se utilizzo un'API privata per l'effetto zoom, con quale probabilità Apple getterà la mia app nel cestino?

Qualcuno ha una soluzione che sto trascurando?

È stato utile?

Soluzione

Ho fatto qualcosa di simile a quello che descrivi, cioèmodificare l'animazione predefinita per pop e push della vista in UINavigationController.

L'idea è disabilitare l'animazione predefinita per l'oggetto e sostituirla con la tua animazione.Ho creato una nuova categoria per UINavigationController e ho utilizzato una funzione simile a quella seguente.

 - (void) altAnimatePopViewControllerAnimated:(BOOL)animated
 {
[CATransaction begin];

CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionPush;          // Use any animation type and subtype you like
transition.subtype = kCATransitionFromTop;
transition.duration = 0.3;

CATransition *fadeTrans = [CATransition animation];
fadeTrans.type = kCATransitionFade;
fadeTrans.duration = 0.3;


[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];

[[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
[[[[self.view subviews] objectAtIndex:1] layer] addAnimation:fadeTrans forKey:nil];



[self  popViewControllerAnimated:YES];
[CATransaction commit];
   }

per utilizzare basta usare il codice

   [self.navigationController altAnimatePopViewControllerAnimated:YES];

Per fare un push basta creare un'altra funzione simile e invertire l'animazione.

Non è perfetto ma funziona.Quando scegli diversi tipi di animazione, gioca con le diverse visualizzazioni secondarie che compongono la barra di navigazione/controller per renderla perfetta.

Ci ho messo un bel po' di tempo per inventarlo, quindi usalo saggiamente :)

******* MODIFICARE

Prova a sostituire la transizione push con questa (non l'ho provato personalmente):

  CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
  scale.duration = duration;
  scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:.5f],
              [NSNumber numberWithFloat:1.2f],
              [NSNumber numberWithFloat:.85f],
              [NSNumber numberWithFloat:1.f],
              nil];

Questo farà un pop-in, ad es.la vista sarà più grande prima di raggiungere le dimensioni corrette.Gioca con i valori nell'array per controllare la curva dell'animazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top