如何在iOS 7上使用animateWithDuration:来呈现视图控制器?

3

我目前正在使用以下代码来展示我的视图控制器。

CATransition* transition = [CATransition animation];
transition.duration = 1;
transition.type = kCATransitionFade;
transition.subtype = kCATransitionFromBottom;
[self.view.window.layer addAnimation:transition forKey:kCATransition];
[self presentViewController:viewController animated:NO completion:nil];

我需要使用更复杂的动画,利用UIView animateWithDuration方法。这只是模态表示,背景视图控制器应该保留在那里。我如何动画呈现视图控制器的视图?

更新:代码的下一个版本 :)

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:NULL];
RootViewControllerEx *viewController = (RootViewControllerEx *)[sb instantiateViewControllerWithIdentifier:@"SB_RDVC"];
viewController.transitioningDelegate = self;
viewController.modalPresentationStyle = UIModalPresentationCustom;
[self presentViewController:viewController animated:YES completion:nil];
...

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    ...
}

在Storyboard中,VC(视图控制器)没有指定任何segue,它在Storyboard中孤零零的存在 :)

1个回答

5

您需要将UIViewControllermodalPresentationStyle设置为UIModalPresentationCustom

然后,您需要创建一个符合UIViewControllerTransitioningDelegate协议的类,并将其设置为presentedViewController的代理。

示例:

YourViewController *viewController = [[YourViewController alloc] init];
viewController.delegate = self;
viewController.transitioningDelegate = self;
viewController.modalPresentationStyle = UIModalPresentationCustom;

[self.navigationController presentViewController:viewController animated:YES completion:nil];

您需要实现以下方法:
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;

该方法返回一个符合 UIViewControllerAnimatedTransitioning 协议的对象,实现以下方法:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIView *inView = [transitionContext containerView];
    UIView *toView = [[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey] view];

    toView.frame = //CGRectMake(0,0,0,0);
    [inView addSubview:toView];
    // Use whatever animateWithDuration you need
    [UIView animateWithDuration:0.6f delay:0.0f usingSpringWithDamping:0.7f initialSpringVelocity:0.5f options:UIViewAnimationOptionCurveEaseIn animations:^{
// Custom animation here
    } completion:^(BOOL finished) {
        // IMPORTANT
        [transitionContext completeTransition:YES];
    }];
}

始终记得在转换完成时告知上下文,否则你将进入不稳定状态。


4
我原本正在打的内容,所以我放弃了并点了赞,表示同意你的观点。 - jrturton
是的,我的类被声明为实现 UIViewControllerTransitioningDelegate 协议,而它确实实现了该协议。请参见更新。 - Pablo
当我正在实现其他委托方法时,看起来这种方式只适用于iOS 7。我的错误是我没有提到iOS 6/7。所以现在我不确定是否应该修改我的问题或为iOS 6添加新问题。 - Pablo
自定义UIViewController的转场动画是在iOS7中引入的。如果您明确说明需要支持iOS6,那么会更有帮助。 - Tim
同样的方式,您可以为另一个动画创建另一个委托。或者,如果您想要默认动画,请确保在解除显示之前将 modalPresentationStyle 设置为 UIModalPresentationNone - Tim
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接