Comme tout le monde connaît le UINavigationController Poussez un ViewController de gauche à droite, existe-t-il un moyen de pousser la vue de droite à gauche? comme l'animation pour le bouton de retour.
Pour l'instant j'ai ceci:
[self.navigationController pushViewController:viewController animated:YES];
Vous pouvez créer une NSMutableArray
à partir du tableau viewcontrollers
du navigateurContrôleur et insérer un nouveau viewController avant celui en cours. Puis définissez le tableau viewControllers sans animation et réapparaissez.
UIViewController *newVC = ...;
NSMutableArray *vcs = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[vcs insertObject:newVC atIndex:[vcs count]-1];
[self.navigationController setViewControllers:vcs animated:NO];
[self.navigationController popViewControllerAnimated:YES];
S'il vous plaît, essayez celui-la
HomePageController *pageView = [[HomePageController alloc] initWithNibName:@"HomePageController_iPhone" bundle:nil];
CATransition *transition = [CATransition animation];
transition.duration = 0.45;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
transition.delegate = self;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
self.navigationController.navigationBarHidden = NO;
[self.navigationController pushViewController:pageView animated:NO];
Try this :
//Push effect in reverse way
CATransition* transition = [CATransition animation];
transition.duration = 0.75;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController pushViewController:vc animated:NO];
Ce code fonctionne bien. S'il vous plaît essayez
CATransition *transition = [CATransition animation];
transition.duration = 0.3f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionReveal;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.navigationController pushViewController:phoneServicesViewController animated:NO];
Vous semblez vouloir "revenir". Cela peut être réalisé par trois méthodes sur votre instance UINavigationController
:
Pour revenir au contrôleur "root":
-(NSArray *)popToRootViewControllerAnimated:(BOOL)animated
Ou pour revenir à l'un des contrôleurs précédents:
-(NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
Ou pour revenir au contrôleur précédemment poussé:
-(UIViewController *)popViewControllerAnimated:(BOOL)animated
Juste une amélioration de la meilleure réponse ici à mon avis:
UIViewController *newVC = ...;
[self.navigationController setViewControllers:@[newVC, self] animated:NO];
[self.navigationController popViewControllerAnimated:YES];
Et pour revenir au contrôleur initial, il suffit de faire un Push to it.
Non, de droite à gauche est réservé pour extraire les contrôleurs de vue de la pile de navigation. Vous pouvez toutefois obtenir un tel effet en animant vous-même les vues. Quelque chose comme:
[UIView beginAnimations:@"rightToLeft" context:NULL];
CGRect newFrame = aView.frame;
newFrame.Origin.x -= newFrame.size.width;
aView.frame = newFrame;
[UIView commitAnimations];
Cela ne fera cependant rien pour votre contrôleur de navigation.
Sur la base de la réponse de @felixlam, j'ai mis à niveau et créé un contrôleur de navigation "inversé" qui remplace les méthodes Push/pop par défaut pour agir de la sorte.
class LeftPushNavigationController: BaseNavigationController {
override func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.isEnabled = false
}
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
// If the Push is not animated, simply pass to parent
guard animated else { return super.pushViewController(viewController, animated: animated) }
// Setup back button
do {
// Hide original back button
viewController.navigationItem.setHidesBackButton(true, animated: false)
// Add new one
viewController.navigationItem.rightBarButtonItem = UIBarButtonItem(
image: #imageLiteral(resourceName: "iconBackReverse"),
style: .plain,
target: self,
action: #selector(self.pop)
)
}
// Calculate final order
let finalVCs = self.viewControllers + [viewController]
// Insert the viewController to the before-last position (so it can be popped to)
var viewControllers = self.viewControllers
viewControllers.insert(viewController, at: viewControllers.count - 1)
// Insert viewcontroller before the last one without animation
super.setViewControllers(viewControllers, animated: false)
// Pop with the animation
super.popViewController(animated: animated)
// Set the right order without animation
super.setViewControllers(finalVCs, animated: false)
}
override func popViewController(animated: Bool) -> UIViewController? {
// If the Push is not animated, simply pass to parent
guard animated else { return super.popViewController(animated: animated) }
guard self.viewControllers.count > 1 else { return nil }
// Calculate final order
var finalVCs = self.viewControllers
let viewController = finalVCs.removeLast()
// Remove the parent ViewController (so it can be pushed)
var viewControllers = self.viewControllers
let parentVC = viewControllers.remove(at: viewControllers.count - 2)
// Set the viewcontrollers without the parent & without animation
super.setViewControllers(viewControllers, animated: false)
// Create Push animation with the parent
super.pushViewController(parentVC, animated: animated)
// Set the right final order without animation
super.setViewControllers(finalVCs, animated: false)
// Return removed viewController
return viewController
}
@objc
private func pop() {
_ = popViewController(animated: true)
}
}
J'ai eu le même problème, voici comment je l'ai résolu
[self.navigationController popViewControllerAnimated: YES];
Cela ressemblera à un "retour en arrière", c’est-à-dire une situation dans laquelle un bouton de retour est cliqué et vous accédez à la page précédente.