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.
È correlato a 'initialFrameForViewController:' dell'istanza 'UIViewControllerContextTransitioning'? – Mark
Hai riscontrato questo problema utilizzando il dispositivo o solo nel simulatore? – MatterGoal
@MatterGoal anche sul dispositivo. Sembra che la vista inizi a 0,0 indipendentemente da ciò che ho impostato. – Mark