Нажмите ViewController справа налево с помощью UINavigationController

Поскольку все знают, что UINavigationController нажимает ViewController слева направо, есть ли способ нажать «Вид справа налево»? как анимация для кнопки «Назад».
Пока у меня это:

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

Вы можете создать NSMutableArray из массива viewcontrollers и вставить новый viewController перед текущим. Затем установите массив viewControllers без анимации и поп назад.

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

Примерьте вот это

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

Этот код работает нормально. Пожалуйста попробуйте

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

Кажется, вы хотите «вернуться». Это может быть достигнуто тремя способами в вашем экземпляре UINavigationController :

Чтобы вернуться к «корневому» controllerу:

-(NSArray *)popToRootViewControllerAnimated:(BOOL)animated

Или вернуться к одному из предыдущих controllerов:

-(NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated

Или вернуться к ранее нажатому controllerу:

-(UIViewController *)popViewControllerAnimated:(BOOL)animated

Нет, право налево зарезервировано для вывода диспетчеров просмотров из стека навигации. Однако вы можете получить такой эффект, анимируя взгляды самостоятельно. Что-то вроде:

 [UIView beginAnimations:@"rightToLeft" context:NULL]; CGRect newFrame = aView.frame; newFrame.origin.x -= newFrame.size.width; aView.frame = newFrame; [UIView commitAnimations]; 

Это, однако, ничего не сделает с вашим controllerом навигации.

Просто улучшение лучшего ответа здесь, на мой взгляд:

 UIViewController *newVC = ...; [self.navigationController setViewControllers:@[newVC, self] animated:NO]; [self.navigationController popViewControllerAnimated:YES]; 

И чтобы вернуться к первоначальному controllerу, просто сделайте толчок к нему.

У меня была та же проблема, вот как я ее решил

[self.navigationController popViewControllerAnimated: YES];

Это будет напоминать «возврат», то есть ситуацию, когда нажата кнопка «Назад», и вы переходите к предыдущей странице

Основываясь на ответе @felixlam, я обновил и создал навигационный controller направления «назад», который переопределяет методы push / pop по умолчанию, чтобы действовать так.

 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) } } 
  • UIScrollView: подкачка по горизонтали, прокрутка по вертикали?
  • NSOperation на iPhone
  • Интеграция CFNetwork и Bonjour для интеграции iPhone и Mac
  • Разработка iPhone: освобожден указатель
  • Плохой URL-адрес при запросе с помощью NSURL
  • UIPopoverController для iphone не работает?
  • UIScrollView не прокручивается после обновления до iOS7 / xcode 5
  • Позиционирование MKMapView для одновременного отображения нескольких аннотаций
  • UIImage для base64 Кодирование строк
  • Что такое NSCFDictionary?
  • Программно включить Bluetooth в iphone sdk?
  • Давайте будем гением компьютера.