【发布时间】:2014-09-15 15:04:16
【问题描述】:
我正在使用 presentViewController 和自定义 modalPresentationStyle 呈现 UIViewController,以实现 Facebook POP 动画过渡。
模态视图本身是完全动态的,在代码中使用自动布局约束定义。没有 xib/storyboard 支持模态。
我无法让模态视图在屏幕上居中!自动布局是不够的,因为没有超级视图可以添加约束!
我的演示代码如下所示(取自 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"];
}
这很好用,但我需要动态的实际视图大小(有时模态将有四行文本和两个按钮等)。为此,我需要在 VC 子类中设置 translatesAutoresizingMaskIntoConstraints=NO。这显然否定了我在演示动画师中所做的帧居中。
最终结果是一个模态框粘在屏幕的左边缘;奇怪的是,它垂直居中,而不是水平居中。从视觉上看,它看起来像这样(请原谅黑色方块,出于法律目的,我必须这样做):
显而易见的解决方案是添加一个使视图居中的视图约束。没问题吧?
但是我在哪里添加它? view.superview 为零;没有superview。我尝试创建一个自定义的“superview”属性并进行设置,但自动布局不知道如何处理其视图层次结构之外的视图(呈现的 vc)。这是我的视图层次结构的样子,带注释:
您显然不应该直接访问 UITransitionView。 UIWindow 上的约束无效。
有人有什么建议吗?遇到这种事,你们是怎么处理的?
【问题讨论】:
-
我实际上没有适合你的解决方案,但我告诉你在这种情况下我会怎么做:注释掉任何自动布局,通过 CGRectMake( 。还有一件事:你提出这个问题的方式很难说问题出在哪里。祝你好运。
-
这是第 22 条规则。我需要使用自动布局,因为视图需要是完全动态的。
标签: ios objective-c uiviewcontroller uiviewanimationtransition facebook-pop