Sto presentando un UIViewController utilizzando presentViewController e un modalPresentationStyle personalizzato, nel tentativo di implementare una transizione animata POP di Facebook.Centrare la vista modale con Autolayout
La vista modale è completamente dinamica, definita utilizzando i vincoli di Autolayout nel codice. Non ci sono xib/storyboard per supportare il modal.
Non riesco a ottenere la visualizzazione modale al centro sullo schermo! L'autolayout non è sufficiente, perché non c'è superview per aggiungere vincoli!
Il mio codice presentazione simile a questa (presa da un campione di FB di codice POP):
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
UIView *fromView = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey].view;
fromView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
fromView.userInteractionEnabled = NO;
UIView *dimmingView = [[UIView alloc] initWithFrame:fromView.bounds];
dimmingView.backgroundColor = [UIColor colorWithRed:(24/255.0) green:(42/255.0) blue:(15/255.0) alpha:1.0];
dimmingView.layer.opacity = 0.0;
UIView *toView = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey].view;
toView.frame = CGRectMake(0,
0,
CGRectGetWidth(transitionContext.containerView.bounds) - 104.f,
CGRectGetHeight(transitionContext.containerView.bounds) - 320.f);
toView.center = CGPointMake(transitionContext.containerView.center.x, -transitionContext.containerView.center.y);
[transitionContext.containerView addSubview:dimmingView];
[transitionContext.containerView addSubview:toView];
POPSpringAnimation *positionAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];
positionAnimation.toValue = @(transitionContext.containerView.center.y);
positionAnimation.springBounciness = 10;
[positionAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
[transitionContext completeTransition:YES];
}];
POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
scaleAnimation.springBounciness = 20;
scaleAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(1.2, 1.4)];
POPBasicAnimation *opacityAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerOpacity];
opacityAnimation.toValue = @(0.2);
[toView.layer pop_addAnimation:positionAnimation forKey:@"positionAnimation"];
[toView.layer pop_addAnimation:scaleAnimation forKey:@"scaleAnimation"];
[dimmingView.layer pop_addAnimation:opacityAnimation forKey:@"opacityAnimation"];
}
Questo funziona in modo bello, ma ho bisogno delle dimensioni di visualizzazione effettiva di essere dinamica (a volte il modal avrà quattro righe di testo e due pulsanti, ecc.). Per fare ciò, ho bisogno di impostare translatesAutoresizingMaskIntoConstraints = NO nella sottoclasse VC. Questo ovviamente nega il centraggio del frame che sto facendo nell'animatore della presentazione.
Il risultato finale è una modale bloccata sul bordo sinistro dello schermo; curiosamente, si centra verticalmente, ma non orizzontalmente. Visivamente, sembra qualcosa di simile (pardon i quadrati neri, ho dovuto farlo per motivi legali):
La soluzione più ovvia sarebbe quella di aggiungere un vincolo vista che centra la vista. Nessun problema, giusto?
Ma dove lo aggiungo? view.superview è nullo; non c'è superview. Ho provato a creare una proprietà personalizzata 'superview' e ad impostarla, ma l'autoapprendimento non sa come gestire una vista al di fuori della sua gerarchia di visualizzazione (la vc di presentazione). Questo è ciò che la mia gerarchia di vista assomiglia, annotato:
Stai a quanto pare non suppone di accedere direttamente alla UITransitionView. I vincoli sulla UIWindow non hanno alcun effetto.
Qualcuno ha qualche consiglio? Come gestite questo genere di cose?
io in realtà non hanno la soluzione per ma io ti dico cosa farei in questa situazione: ** Commenta qualsiasi Autolayout **, ** Imposta posizione tramite CGRectMake (**. Ancora una cosa: il modo in cui hai strutturato questa domanda è difficile da dire dove il problema è: buona fortuna – carlodurso
Questo è il trucco 22. Devo usare il layout automatico, perché la vista deve essere completamente dinamica. – cdstamper