Custom transition et rotation

muqaddarmuqaddar Administrateur
août 2014 modifié dans API UIKit #1

Salut, 


 


Je m'essaie aux transitions personnalisés entre 2 ViewControllers introduites avec iOS 7.


http://www.objc.io/issue-5/view-controller-transitions.html


 


J'ai un truc sympa qui tourne bien, sauf lors d'une rotation.


 


En gros j'affiche un drawer qui contient un VC à  droite de la vue principale (1/4 de sa largeur) . Parfait. Mais si je fais une rotation après avoir afficher le drawer, celui-ci s'agrandit OU s'il a d'abord été affiché en mode paysage, il disparait en mode portrait. Bref, moi je veux que mon drawer fasse 250 de large en portrait ou en landscape et qu'il s'adapte au moment de la rotation.


 


J'ai regardé ce tuto aussi:


http://www.brightec.co.uk/blog/ios-7-custom-view-controller-transitions-and-rotation-making-it-all-work


 


mais ça ne change pas mon problème. Certes on peut savoir quelle est l'orientation du device au moment ou on affiche le drawer, mais ça ne suffit pas. Il faut trouver un moyen de rappeler "l'affichage" après une rotation.


 


Quelle est la meilleure façon de faire depuis le VC parent qui appelle la transition custom ? (sans avoir à  faire un hide/show après une détection d'une rotation)


 


Un peu de code:



#define TRANSITION_WIDTH_IPAD 250.0
#define TRANSITION_WIDTH_IPHONE 200.0

@implementation IDTransitionController

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
  return 0.5f;
}

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIView *inView = [transitionContext containerView];
    UIView *toView = [[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey] view];
    UIView *fromView = [[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey] view];
  
    float width = 0.0;
    if DEVICE_IPAD width = TRANSITION_WIDTH_IPAD;
    if DEVICE_IPHONE width = TRANSITION_WIDTH_IPHONE;

    if (!self.presenting)
    {
      // change frame
      toView.frame = CGRectMake(fromView.frame.size.width, 0, width, fromView.frame.size.height);
      toView.alpha = 0.95f;
      [inView addSubview:toView];
    }
    
    CGFloat damping = 0.5;
    NSTimeInterval duration = [self transitionDuration:transitionContext];

    [toView setUserInteractionEnabled: true];
    [fromView setUserInteractionEnabled: false];
    
    [UIView animateWithDuration:duration delay:0 usingSpringWithDamping:damping initialSpringVelocity:10.0 options:0 animations:^{
        if (self.presenting)
        {
          fromView.transform = CGAffineTransformMakeTranslation(width, 0);

          NSEnumerator *enumerator = [inView.layer.sublayers objectEnumerator];
          for (CALayer *layer in enumerator) {
            [layer removeFromSuperlayer];
            break;
          }
        }
        else {
          toView.transform = CGAffineTransformMakeTranslation(-width, 0);
        }

    } completion:^(BOOL finished) {
        [transitionContext completeTransition:finished]; // vital
    }];

}

EDIT: la première conférence de la WWDC 2014 (session 228) parle de ceci, mais j en'y arrive pas, et en plus de nouvelles méthodes sont réservées à  iOS 8.


 


https://developer.apple.com/videos/wwdc/2014/

Connectez-vous ou Inscrivez-vous pour répondre.