2013-12-11 9 views
7

Sto provando a eseguire una transizione molto semplice: una vista sposta metà dello schermo a sinistra mentre la seconda ("a") vista si sposta a metà schermo.Sfarfallio durante la transizione del controller di visualizzazione personalizzata iOS 7

Ho l'animazione in funzione, ma quando inverto l'animazione, vedo uno sfarfallio. La vista "a" (cioè la vista originale) è visibile all'origine di 0,0 sebbene io abbia impostato una cornice diversa.

Ho scaricato la gerarchia delle viste. I fotogrammi sono impostati correttamente (-100 0; 320 480 per la vista), ma tuttavia si presenta a 0,0. Uno screenshot della vista è memorizzato in cache da qualche parte per l'animazione?

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 

UIView *container = [transitionContext containerView]; 

CGRect offsetCoverRect = CGRectMake(-100.0, 0.0, 320, 480); 
CGRect detailsRect  = CGRectMake(-100.0 + 320.0, 0.0, 320, 480); 
CGRect detailsOutsideRect = CGRectMake(320.0, 0.0, 320, 480); 

CGRect normalRect = CGRectMake(0.0, 0.0, 320, 480); 


if (self.revealDetails) 
{ 
    toViewController.view.frame = detailsOutsideRect; 
    [container addSubview:toViewController.view]; 
} 
else 
{ 
    [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 

    // reversing… set the frame to the original offset (shows at 0,0 for a moment) 
    toViewController.view.frame = offsetCoverRect; 
} 

[UIView animateKeyframesWithDuration:2 delay:0 options:0 animations:^{ 

    if (self.revealDetails) 
    { 
     fromViewController.view.frame = offsetCoverRect; 
     toViewController.view.frame = detailsRect; 
    } 
    else 
    { 
     fromViewController.view.frame = detailsOutsideRect; 
     toViewController.view.frame = normalRect; 
    } 
} completion:^(BOOL finished) { [transitionContext completeTransition:finished]; }]; 
} 

Aggiornamento:

sembra essere correlato a UIModalPresentationCustom. Devo usare questo in modo che la vista da non venga rimossa al termine della transizione. Tuttavia, sembra presupporre che il controller da vista per la transizione inversa inizi da 0,0.

Aggiornamento 2:

molto facile da riprodurre con il codice seguente:

UIView *snapshot = [containerView snapshotViewAfterScreenUpdates:NO]; 
[containerView addSubview:snapshot]; 

Quanto sopra visualizza per visualizzare centrata su schermo, non importa quale centro cornice reale o ho impostato prima l'animazione.

+0

È correlato a 'initialFrameForViewController:' dell'istanza 'UIViewControllerContextTransitioning'? – Mark

+0

Hai riscontrato questo problema utilizzando il dispositivo o solo nel simulatore? – MatterGoal

+0

@MatterGoal anche sul dispositivo. Sembra che la vista inizi a 0,0 indipendentemente da ciò che ho impostato. – Mark

risposta

-2

Questo perché il metodo animateTransition viene chiamato dallo sfondo. Chiamate il vostro metodo in questo modo

dispatch_async(dispatch_get_main_queue(),^
       { 
        [self animateTransition]; // your method goes here 
       }); 

Non si dovrebbe mai chiamare qualsiasi animazione o tutti i metodi relativi UI su thread in background

+0

animateTransition: viene chiamata dal framework. –

2

So che questa è una vecchia questione, ma mi sono imbattuto nello stesso problema e dopo ore di lotta, finalmente si avvicinò con una soluzione:

Nel blocco completamento della presente animazione,

  1. creare uno snapshot del fromView View Controller
  2. Eseguire modifiche del telaio/trasforma sull'istantanea
  3. Aggiungere snapshot al containerView
  4. Rimuovere la vista fromViewController dal punto di vista del contenitore
  5. Nel blocco di completamento dell'animazione respingere (o dovunque se un licenziamento ?), rimuovere l'istantanea dal contenitore

Rimuovendo la vista fromViewController dalla vista contenitore, non viene reimpostata alla posizione iniziale perché non è più all'interno della vista contenitore.

Problemi correlati