Ich präsentiere einen UIViewController, der presentViewController und einen benutzerdefinierten modalPresentationStyle verwendet, um einen animierten Facebook-POP-Übergang zu implementieren.Zentrieren von Modal View mit Autolayout
Die modale Ansicht selbst ist vollständig dynamisch und wird mit Autolayout-Einschränkungen im Code definiert. Es gibt kein XIB/Storyboard, um das Modal zu unterstützen.
Ich kann nicht die modale Ansicht auf dem Bildschirm zentrieren! Autolayout ist nicht ausreichend, da es keinen Superview zum Hinzufügen von Constraints gibt!
Mein präsentierenden Code sieht wie folgt aus (von FB POP Code Probe entnommen):
- (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"];
}
Dies funktioniert wunderbar, aber ich brauche die aktuelle Ansicht Größe dynamisch zu sein (manchmal wird die modale haben vier Zeilen Text und zwei Schaltflächen usw.). Um dies zu erreichen, muss ich translateAutoresizingMaskIntoConstraints = NO in der VC-Unterklasse setzen. Dies negiert offensichtlich die Rahmenzentrierung, die ich in dem Präsentationsanimator mache.
Das Endergebnis ist ein Modal, das am linken Bildschirmrand hängt; Interessanterweise zentriert es sich vertikal, aber nicht horizontal. Optisch sieht es so etwas wie dies (die schwarzen Quadrate verzeihen, ich hatte es aus rechtlichen Gründen zu tun):
Die offensichtliche Lösung, die eine Ansicht Einschränkung hinzuzufügen wäre, die die Ansicht Mitte. Kein Problem, oder?
Aber wo füge ich es hinzu? view.superview ist null; Es gibt keinen Superview. Ich habe versucht, eine benutzerdefinierte "Superview" -Eigenschaft zu erstellen und sie zu setzen, aber das automatische Layout kann nicht mit einer Ansicht umgehen, die sich außerhalb ihrer Ansichtshierarchie (dem präsentierenden VC) befindet. Dies ist, was meiner Ansicht nach Hierarchie aussieht, kommentierte:
Sie sind offenbar die UITransitionView den direkten Zugriff nicht zugelassen. Einschränkungen für das UIWindow haben keine Auswirkungen.
Hat jemand einen Rat? Wie gehst du mit so etwas um?
Ich habe nicht wirklich die Lösung für Sie aber ich sage Ihnen, was ich in dieser Situation tun würde: ** Kommentieren Sie alle Autlayout **, ** Setzen Sie Position über CGRectMake (**. Noch eine Sache: Die Art, wie Sie diese Frage strukturiert haben, ist es schwer zu sagen, wo Das Problem ist, viel Glück – carlodurso
Das ist die catch-22 Ich muss Auto-Layout verwenden, da die Ansicht vollständig dynamisch sein muss – cdstamper