我需要在另一个视图控制器的中心呈现一个具有一些动画效果的视图控制器。我希望转换是可重用的,所以我定义了一个实现UIViewControllerAnimatedTransitioning协议的类。我只是简单地向subView添加约束以将其定位到中心,更改容器的颜色,然后执行动画:
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
if (self.status == TransitioningStatusPresent) {
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
UIView *containerView = [transitionContext containerView];
containerView.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.25f];
[containerView addSubview:toView];
toView.translatesAutoresizingMaskIntoConstraints = NO;
id c1 = [NSLayoutConstraint constraintWithItem:toView
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:containerView
attribute:NSLayoutAttributeCenterX
multiplier:1.0f constant:0.0f];
id c2 = [NSLayoutConstraint constraintWithItem:toView
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:containerView
attribute:NSLayoutAttributeCenterY
multiplier:1.0f constant:0.0f];
[containerView addConstraints:@[c1, c2]];
toView.alpha = 0.0f;
[UIView animateWithDuration:TRANSITION_DURATION animations:^{
toView.alpha = 1.0f;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}else{
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];
fromView.alpha = 1.0f;
[UIView animateWithDuration:TRANSITION_DURATION animations:^{
fromView.alpha = 0.0f;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
}
如果动画代码有效:是。
然而,它没有像我没有动画时所期望的那样工作:
[self presentViewController:messageBoxViewController animated:NO completion:nil];
这只是因为在没有动画时不会调用-animateTransition函数。因此,我认为我不应该把约束放在这个函数中,但是我应该把它放在哪里?
我的应用程序需要与iOS 7兼容,因此不允许使用演示控制器。但我需要访问容器。 那么我怎样才能使用-presentViewController:animated:completion:method来自定义转换视图控制器。
那我该如何解决这个问题?
答案 0 :(得分:0)
不要添加约束,尝试使用框架制作动画。它会工作。但如果你制作动画为NO,那么显然它永远不会被执行。 如果您遇到许多问题,那么您可以做的是,获取sourceController的快照并将其添加到destinationController,然后将视图设置为动画到中心。确保您的动画属性为false。