【问题标题】:UIViewControllerAnimatedTransitioning with a MPMoviePlayerViewControllerUIViewControllerAnimatedTransitioning 与 MPMoviePlayerViewController
【发布时间】:2014-03-12 14:50:18
【问题描述】:

我正在尝试制作自定义演示动画,但 VC 是 MPMoviePlayerViewController。我正在学习本教程:

当我提出MPMoviePlayerViewController 时,一切正常。

但是当我关闭它时,只需方法:

 - (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed

没有调用,我做错了什么?

这是代码:

- (IBAction)playButtonTouchedIn:(id)sender {

    NSURL *url = [[NSBundle mainBundle]URLForResource:@"Learn to speak Spanish quickly with funny videos on youtube" withExtension:@"mp4"];

    MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc]initWithContentURL:url];
    player.transitioningDelegate = self;
    player.modalTransitionStyle = UIModalPresentationCustom;
    [player.moviePlayer setShouldAutoplay:NO];
    player.moviePlayer.controlStyle = MPMovieControlStyleNone;
    [self presentViewController:player animated:YES completion:^{
        [player.moviePlayer play];
        player.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
    }];
}

UIViewControllerTransitioningDelegate 方法:

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:    (UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    self.presenting = YES;
    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.presenting = NO;
    return self;
}

UIViewControllerAnimatedTransitioning 方法

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
    return 0.7;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController *fromViewController = [transitionContext     viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];


    if (self.isPresenting) {
        [fromViewController.view setUserInteractionEnabled:NO];

        [transitionContext.containerView addSubview:fromViewController.view];
        [transitionContext.containerView addSubview:toViewController.view];

        CGRect startFrame = toViewController.view.frame;
        toViewController.view.frame = (CGRect){CGPointMake(toViewController.view.frame.size.width, 0),startFrame.size};
        [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:4.0f options:UIViewAnimationOptionCurveEaseOut animations:^{    
            toViewController.view.frame = startFrame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];

            [fromViewController.view setUserInteractionEnabled:YES];
        }];
    }
    else{
        [toViewController.view setUserInteractionEnabled:YES];

        [transitionContext.containerView addSubview:toViewController.view];
        [transitionContext.containerView addSubview:fromViewController.view];

        CGRect finalFrame = (CGRect){CGPointMake(-fromViewController.view.frame.size.width, 0),fromViewController.view.frame.size};
        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            fromViewController.view.frame = finalFrame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

我已尝试使用我开发的视图控制器,效果很好,MPMoviePlayerViewController 也应该如此?

【问题讨论】:

  • 您找到解决方案了吗?
  • 这也发生在我身上。你还记得MPMoviePlayerViewController 是否在UINavigationController 中吗?我想知道这是否与它有关。
  • 有点违反直觉,看起来您需要在它关闭之前再次设置transitioningDelegatemodalPresentationStyle。这绝对不是预期的......
  • @MattBaker 在哪里?我有这个问题,但没有使用任何电影播放器​​ api 的
  • @DevilInDisguise 查看我刚刚发布的答案,如果它为您解决问题,请告诉我。

标签: ios ios7 uiviewanimationtransition


【解决方案1】:

我能够让它在解雇时正确动画的方法是在调用[presentingViewController dismissViewControllerAnimated:YES];之前重新设置transitioningDelegatemodalTransitionStyle

所以不仅仅是

- (IBAction) closePressed:(id)sender {
    [self.presentingViewController dismissViewControllerAnimated:YES];
}

你会的

- (IBAction) closePressed:(id)sender {
    MPCustomModalTransitionDelegate *delegate = [[MPCustomModalTransitionDelegate alloc]init];
    self.transitioningDelegate = delegate;
    self.modalTransitionStyle = UIModalPresentationCustom;
    [self.presentingViewController dismissViewControllerAnimated:YES];
}

这里明显的区别是添加了一个新的MPCustomModalTransitionDelegate 类,您需要从视图控制器中重构它。

【讨论】:

  • 我会尽快去看看。我记得尝试了各种方法来让这些东西正常工作。主要问题是我永远无法让自定义转换成功并完全关闭 VC,因此在四处滑动时会严重超载内存。我没有找到解决办法。我确实尝试过调用dismissViewControllerAnimated 之类的,但这显然不能强制它被释放;甚至认为它可能会使它消失..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多