Я представляю UIViewController, используя presentViewController и собственный modalPresentationStyle, чтобы реализовать анимированный переход POP на Facebook.
Модальное представление полностью динамично, определяется с помощью ограничений Autolayout в коде. Существует нет xib/раскадровки, чтобы поддержать модальный.
Я не могу получить модальное представление на экране! Autolayout недостаточно, потому что нет супервизора для добавления ограничений на!
Мой представляющий код выглядит так (взятый из примера кода FB 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"];
}
Это работает красиво, но мне нужен фактический размер представления, чтобы быть динамичным (иногда модальный будет иметь четыре строки текста и две кнопки и т.д.). Для этого мне нужно установить translatesAutoresizingMaskIntoConstraints = NO в подклассе VC. Это, очевидно, отрицает центрирование кадра, которое я выполняю в аниматоре презентации.
Конечный результат - модальный, прикрепленный к левому краю экрана; Любопытно, что он центрирует себя вертикально, но не горизонтально. Визуально это выглядит примерно так (помилуй черные квадраты, я должен был сделать это для юридических целей):
Очевидным решением было бы добавить ограничение представления, которое центрирует представление. Нет проблем, правильно?
Но где его добавить? view.superview - nil; нет супервизора. Я попытался создать собственное свойство "superview" и установить его, но автозапуск не знает, как обрабатывать представление, находящееся за пределами его иерархии представлений (презентация vc). Вот как выглядит моя иерархия просмотров, аннотированная:
Вы, очевидно, не должны напрямую обращаться к UITransitionView. Ограничения на UIWindow не влияют.
Есть ли у кого-нибудь советы? Как вы, ребята, справляетесь с этим?