back button n'apparaà®t pas avec custom transition

LouLou Membre
décembre 2014 modifié dans API UIKit #1

Salut,


 


j'ai un petit soucis avec le back button, après une transition normale avec les réglages du storyboard, le back text apparaà®t bien, mais après une custom transition (avec une class qui sert d'animator et les protocol de transition d'ios7), le bouton back n'est plus là . J'utilise presentViewController: ... et j'ai placé le back text dans le storyboard sur le 1er viewController, mais je ne parviens pas à  l'afficher :



- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ( [[segue identifier] isEqualToString:@second] ){

//SecondViewController *secondViewController = [[UIStoryboard storyboardWithName:@Main bundle:nil] instantiateViewControllerWithIdentifier:@SecondViewController];

SecondViewController *secondViewController = [segue destinationViewController];
secondViewController.transitioningDelegate = self;

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


Réponses

  • CéroceCéroce Membre, Modérateur

    Je ne comprends pas ce que tu cherches à  faire.


    -prepareForSegue:sender: est appelée pour te donner une opportunité de fournir des infos au destinationViewController avant l'affichage de sa vue.


    Les transitions entre view controllers sont décrites dans le Storyboard; c'est son but. Ce n'est pas à  toi de demander l'affichage.


  • LouLou Membre
    décembre 2014 modifié #3

    J'ai en fait besoin de mettre le transitionDelegate quelque part, pour mettre une custom transition (avec les protocol "UIViewControllerTransitioningDelegate" et une autre classe qui sert d'animator qui implémente "UIViewControllerAnimatedTransitioning" ).


     


    Il y a la transition "Custom" dans les options de "segue" du storyboard, mais c'est pour faire une sous-classe de UIStoryBoardSegue. Je voulais tester les transitions d'ios7.


     


    Ensuite, pour le presentViewController:..., si je ne le met pas, la transition est celle par défaut du storyboard, c'est-à -dire sans utiliser ma classe animator avec les protocol. Si je le met, par contre, la custom transition marche bien, mais je n'ai plus le back text.


     


    Est-ce qu'il y a une autre façon de faire?


  • Joanna CarterJoanna Carter Membre, Modérateur

    WWDC 2013 vidéo 218


  • LouLou Membre
    décembre 2014 modifié #5

    Alors, je dois faire une erreur quelque part, mais je ne vois pas. J'ai enlevé le segue du storyboard, et je crée une instance de mon second viewController à  l'appui d'un bouton. La fonction du delegate n'est pas appelée, quand j'utilise pushViewController.


     


    Avec presentViewController sur le viewController, j'ai bien l'effet de transition, mais je n'ai pas la barre de navigation du navigationController.


     


    Avec push..., il n'y a donc pas de transition.


     


    Voilà  les captures de la vidéo : (self.delegate, je ne sais pas très bien ce que ça représente, donc j'ai laissé transitioningDelegate, peut-être que l'erreur vient de là ? Sinon, mon secondViewController n'est pas attaché au reste par un segue, et j'ai un navigationController tout simple qui est attaché à  SecondViewController par un segue "rootviewController")


     


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu veux essayer le code suivant ?



    - (IBAction)myAction:(UIButton *)sender
    {
    SecondViewController *vc = [[UIStoryboard storyboardWithName:@Main bundle:nil] instantiateViewControllerWithIdentifier:@SecondViewController];

    vc.transitioningDelegate = self;

    vc.modalPresentationStyle = UIModalPresentationCustom;

    [self presentViewController:vc animated:YES completion:nil];
    }

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu as appelé :



    {
    ...

    completion:^(BOOL finished)
    {
    ...

    [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    }];

    ... dans ton "animator" ?


  • LouLou Membre
    décembre 2014 modifié #8

    EDIT: je vais peut-être tout simplement utiliser ma propre UI pour le retour en arrière, à  moins que quelqu'un ait la solution, merci pour les réponses


     


     


    Le present... marche bien, mais je n'ai pas le back button. Le code de ton message fonctionne bien, mais pour le viewcontroller. Je pense que je dois utiliser les fonctions du navigationController pour avoir la barre d'item, n'est-ce pas?


     


    Pour le push..., avec la fonction du pdf, cette fonction n'est jamais appelée. J'ai donc simplement la transition par défaut du "push", mais je n'ai pas le retour dans la fonction du delegate.


     


    Voici ce que j'utilise :



    [self.navigationController pushViewController:vc animated:YES];

    - (id <UIViewControllerAnimatedTransitioning>)navigationController:...
    //--> n'est pas appelé






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

    - (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:...
    //--> est bien appelé, mais pas de back button








    @interface ViewController : UIViewController <UIViewControllerTransitioningDelegate, UINavigationControllerDelegate>




    #import "TransitionAnimator.h"
    #import <CoreGraphics/CoreGraphics.h>

    @implementation TransitionAnimator

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

    if(self.presenting){
    [self executePresentationAnimation:transitionContext];
    }
    else{
    [self executeDismissalAnimation:transitionContext];
    }

    }

    -(void)executeDismissalAnimation:(id<UIViewControllerContextTransitioning>)transitionContext{

    UIView* inView = [transitionContext containerView];

    UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [inView insertSubview:toViewController.view belowSubview:fromViewController.view];

    CGPoint centerOffScreen = inView.center;
    centerOffScreen.y = (-1)*inView.frame.size.height;

    [UIView animateKeyframesWithDuration:1
    delay:0.0f
    options:UIViewKeyframeAnimationOptionCalculationModeLinear
    animations:^{

    [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0.5 animations:^{
    CGPoint center = fromViewController.view.center;
    center.y += 50;
    fromViewController.view.center = center;
    }];

    [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.5 animations:^{
    fromViewController.view.center = centerOffScreen;
    }];

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







    #import "ViewController.h"
    #import "TransitionAnimator.h"
    #import "SecondViewController.h"

    @interface ViewController ()

    @end

    @implementation ViewController

    - (id <UIViewControllerAnimatedTransitioning>)navigationController: (UINavigationController *)nc
    animationControllerForOperation: (UINavigationControllerOperation)op
    fromViewController:(UIViewController *)fromVC
    toViewController:(UIViewController *)toVC {
    NSLog(@>>> transition nav);
    TransitionAnimator *animator = [TransitionAnimator new];
    animator.presenting = YES;
    return animator;
    }


    - (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented
    presentingController:(UIViewController *)presenting
    sourceController:(UIViewController *)source {

    TransitionAnimator *animator = [TransitionAnimator new];
    animator.presenting = YES;
    NSLog(@dans anim delegate master);
    return animator;
    }

    et le storyboard  (1 rootviewController et son navigationController, et un autre secondViewController avec son navigationController, pas de segue entre les deux) :


     


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