2014-02-13 8 views
7

Ich versuche, eine benutzerdefinierte Präsentationsanimation, aber die VC ist eine MPMoviePlayerViewController. Ich folgte diesem Tutorial:UIViewControllerAnimatedTransitioning mit einem MPMoviePlayerViewController

Wenn ich die MPMoviePlayerViewController präsentiere, ist alles richtig.

Aber wenn ich es, einfach die Methode entlassen:

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

nicht genannt wird, was ich falsch mache?

Dies ist der Code:

- (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; 
    }]; 
} 

Die UIViewControllerTransitioningDelegate Methoden:

- (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; 
} 

Die UIViewControllerAnimatedTransitioning Methoden

- (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]; 
     }]; 
    } 
} 

Ich habe von mir mit einem View-Controller entwickelt, ausprobiert und es funktioniert toll, so soll das sein MPMoviePlayerViewController?

+1

Haben Sie Ihre Lösung gefunden? – Georg

+0

Das passiert mir auch. Erinnern Sie sich, ob "MPMoviePlayerViewController" innerhalb eines 'UINavigationControllers' lag? Ich frage mich, ob das etwas damit zu tun hat. –

+0

Etwas kontraintuitiv sieht es so aus, als müssten Sie 'transitioningDelegate' und' modalPresentationStyle' AGAIN unmittelbar vor dem Löschen setzen. Das war definitiv nicht zu erwarten ... –

Antwort

0

Die Art und Weise konnte ich es richtig auf Entlassung zu animieren bekommen die transitioningDelegate und modalTransitionStyle Recht auf neu eingestellt, bevor [presentingViewController dismissViewControllerAnimated:YES];

Anstatt also nur

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

aufrufen würden Sie tun

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

Der offensichtliche Unterschied ist hier die Hinzufügung einer neuen MPCustomModalTransitionDelegate Klasse, die Sie müsste aus Ihrem View-Controller umgestaltet werden.

+0

Ich werde versuchen, es in einiger Zeit zu sehen. Ich erinnere mich daran, verschiedene Sachen auszuprobieren, um das Zeug zum Laufen zu bringen. Das Hauptproblem bestand darin, dass ich den benutzerdefinierten Übergang nie erreichen konnte, um die VC erfolgreich und vollständig zu löschen, wodurch der Speicher beim Überstreichen stark überlastet wurde. Ich habe keine Lösung dafür gefunden. Ich habe versucht, disneyViewControllerAnimated und ähnliches zu nennen, aber das kann anscheinend nicht die Freigabe erzwingen; sogar dachte, es könnte es verschwinden lassen .. – DevilInDisguise