Нажмите ViewController справа налево с помощью UINavigationController
Поскольку все знают, что UINavigationController нажимает ViewController слева направо, есть ли способ нажать «Вид справа налево»? как анимация для кнопки «Назад».
Пока у меня это:
[self.navigationController pushViewController:viewController animated:YES];
- используя objc_msgSend для вызова функции Objective C с именованными аргументами
- Как преобразовать NSTimeInterval (секунды) в минуты
- Обнаружение iPhone / iPod Touch
- Как программно изменить оттенок UIImage?
- Поиск расстояния от значения RSSI устройства Bluetooth с низким энергопотреблением
- Как заполнить фоновое изображение UIView
- Сохранить фотографии в пользовательский альбом в iPhones Photo Library
- На iPhone: узнать, какая песня сейчас играет? (в музыкальном проигрывателе iPod)
- Как я могу программно проверить, присутствует ли клавиатура в приложении iOS?
- Почему NSError нуждается в двойной косвенности? (указатель на указатель)
- NSDictionary с упорядоченными ключами
- Как читать трассировки стека объектов-c
- Что такое хорошо для?
Вы можете создать 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) } }