[iOS8] Gestion rotation iOS8

2»

Réponses

  • muqaddarmuqaddar Administrateur
    octobre 2014 modifié #32


    En appliquant a ta fromFrame la transform inverse de la vue parente (comme sous iOS8 ca sera la CGAffineTransformIdentity ça changera rien mais sous iOS7 ca devrait annuler l'effet de la transform de la rootViewController.view)

     



    CGRectApplyAffineTransform(fromFrame, CGAffineTransformInvert(rootViewController.view.transform))

    (Pas testé)

     




     


    Pas testé, mais pendant que tu répondais, j'ai ajouté un EDIT dans mon message.


  • muqaddarmuqaddar Administrateur

    J'ai essayé ça:



    CGRectApplyAffineTransform(fromView.frame, CGAffineTransformInvert(inView.transform));

    Cela ne change rien à  l'affichage, mais en même temps, je ne suis pas sûr de comprendre ce que je fais.


    :-*  


     


    Je retrouve ma nouvelle vue en plein milieu de la vue parente, au lieu d'être à  droite.


     


    Qu'est ce que tu appelles ici rootViewController, c'est bien le container parent de la modale [transitionContext containerView] ?


  • muqaddarmuqaddar Administrateur
    octobre 2014 modifié #34

    Bon, voilà , après quelques heures, j'ai quelque chose qui marche sous iOS 7 et iOS 8.


     


    Rappel: il s'agit d'afficher un bandeau animé avec transition de 250px de large sur la droite de l'écran, en mode paysage ou portrait. Ce bandeau contient un UINavigationController.


     


    Je me suis aidé de bouts de code trouvés sur le net.



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

      if (self.isPresented == NO)
      {
        DLog(@Presenting View Controller);
        
        fromView.alpha = 0.5;
        
        CGRect startingRect = CGRectOffset(fromView.bounds, CGRectGetWidth(fromView.bounds), 0);
        toView.frame = [containerView convertRect:startingRect fromView:fromView];
        [containerView addSubview:toView];

        // slide from the right
        [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:10.0 options:0 animations:^{
          toView.frame = [containerView convertRect:CGRectMake(fromView.bounds.origin.x + fromView.bounds.size.width - width, fromView.bounds.origin.y, width, fromView.bounds.size.height) fromView:fromView];
        }
        completion:^(BOOL finished) {
          [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
        }];
      }
      else
      {
        DLog(@Hiding View Controller);
        
        toView.alpha = 1.0;
        
        // slide to the right
        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
          CGRect endingRect = CGRectOffset(fromView.bounds, CGRectGetWidth(fromView.bounds), 0);
          fromView.frame = [containerView convertRect:endingRect fromView:fromView];
        }
        completion:^(BOOL finished) {
          [fromView removeFromSuperview];
          [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
        }];
      }
    }

    C'est p-e pas le plus simple du monde, mais au moins ça marche, et je n'ai pas à  jouer avec les transforms.


     


    ---


     


    Mon dernier soucis est d'étendre le bandeau quand je le laisse ouvert et que je fais une rotation du device.


    Ma seule parade actuelle est de le faire disparaà®tre et réapparaà®tre pour relancer les calculs.

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