presentViewController и отображение панели навигации
у меня есть иерархия контроллера вида, а самый верхний контроллер отображается как модальный и хотел бы знать, как отображать панель навигации при использовании
'UIViewController:presentViewController:viewControllerToPresent:animated:completion'
документы для 'presentViewController: animated: completion:' Примечание:
' на iPhone и iPod touch, представленный вид всегда полный экран.
На iPad, презентация зависит от значения в
свойство modalPresentationStyle.-
для 'modalPresentationStyle', The docs say:
стиль представления определяет, как модально представленный контроллер вида отображается на экране. На iPhone и iPod touch контроллеры modal view всегда представлены в полноэкранном режиме, но на iPad есть несколько различных вариантов презентации.
есть ли способ убедиться,что панель навигации отображается под строкой состояния после отображения элемента управления view? Должен ли я интерпретировать документ так, как вы этого не делаете получите любые варианты iPhone / iPod и только на iPad?
ранее я использовал 'UIViewController:presentModalViewController:animated' который работал нормально, но с iOS 5.0 API был устаревшим, поэтому я переключаюсь на новый.
визуально, что я хочу сделать, это иметь новый контроллер слайд в нижней части экрана, так же, как старый API, используемый для этого.
[обновление с кодом]:
// My root level view:
UIViewController *vc = [[RootViewController alloc]
initWithNibName:nil
bundle:[NSBundle mainBundle]];
navController = [[UINavigationController alloc] initWithRootViewController:vc];
....
// Within the RootViewController, Second view controller is created and added
// to the hierarchy. It is this view controller that is responsible for
// displaying the DetailView:
SecondTierViewController *t2controller = [[SecondTierViewController alloc]
initWithNibName:nil
bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:t2controller animated:YES];
// Created by SecondTierViewController
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil
bundle:[NSBundle mainBundle]];
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;
[self.navigationController presentViewController:controller
animated:YES
completion:nil];
12 ответов:
Это правда, что если вы представляете контроллер вида модально на iPhone, он всегда будет представлен в полноэкранном режиме независимо от того, как вы представляете его на контроллере верхнего вида навигационного контроллера или любым другим способом. Но вы всегда можете показать панель навигации таким образом:
вместо представления этого контроллера вида модально представьте навигационный контроллер модально с его корневым контроллером вида, установленным в качестве контроллера вида, который вы хотите:
MyViewController *myViewController = [[MyViewController alloc] initWithNibName:nil bundle:nil]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myViewController]; //now present this navigation controller modally [self presentViewController:navigationController animated:YES completion:^{ }];вы должны увидеть панель навигации, когда ваш вид представлен модально.
Swift 3.0 / 4.0
навигация:
guard let myVC = self.storyboard?.instantiateViewController(withIdentifier: "MyViewController") else { return } let navController = UINavigationController(rootViewController: myVC) self.navigationController?.present(navController, animated: true, completion: nil)Возвращаюсь:
self.dismiss(animated: true, completion: nil)Swift 2.0
навигация:
let myVC = self.storyboard?.instantiateViewControllerWithIdentifier("MyViewController"); let navController = UINavigationController(rootViewController: myVC!) self.navigationController?.presentViewController(navController, animated: true, completion: nil)Возвращаюсь:
self.dismissViewControllerAnimated(true, completion: nil)
вы можете использовать:
[self.navigationController pushViewController:controller animated:YES];вернуться (я думаю):
[self.navigationController popToRootViewControllerAnimated:YES];
У меня была такая же проблема на iOS7. Я вызвал его в селекторе, и он работал как на ios7, так и на ios8.
[self performSelector: @selector(showMainView) withObject: nil afterDelay: 0.0]; - (void) showMainView { HomeViewController * homeview = [ [HomeViewController alloc] initWithNibName: @ "HomeViewController" bundle: nil]; UINavigationController * navcont = [ [UINavigationController alloc] initWithRootViewController: homeview]; navcont.navigationBar.tintColor = [UIColor whiteColor]; navcont.navigationBar.barTintColor = App_Theme_Color; [navcont.navigationBar setTitleTextAttributes: @ { NSForegroundColorAttributeName: [UIColor whiteColor] }]; navcont.modalPresentationStyle = UIModalPresentationFullScreen; navcont.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self.navigationController presentViewController: navcont animated: YES completion: ^ { }]; }
все a
[self.navigationController pushViewController:controller animated:YES];does-это анимация перехода и добавление его в стек навигационного контроллера и некоторые другие интересные анимационные материалы панели навигации. Если вас не волнует анимация бара, то этот код должны работа. Панель появляется на новом контроллере, и вы получаете интерактивный поп-жест!//Make Controller DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]]; //Customize presentation controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical; controller.modalPresentationStyle = UIModalPresentationCurrentContext; //Present controller [self presentViewController:controller animated:YES completion:nil]; //Add to navigation Controller [self navigationController].viewControllers = [[self navigationController].viewControllers arrayByAddingObject:controller]; //You can't just [[self navigationController].viewControllers addObject:controller] because viewControllers are for some reason not a mutable array.Edit: извините, presentViewController заполнит весь экран. Вам нужно будет сделать пользовательский переход, с CGAffineTransform.перевод или что-то, анимировать контроллер с переходом, а затем добавить его в viewControllers navigationController.
Swift 3
let vc0 : ViewController1 = ViewController1() let vc2: NavigationController1 = NavigationController1(rootViewController: vc0) self.present(vc2, animated: true, completion: nil)
решение
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; navController.modalPresentationStyle = UIModalPresentationCurrentContext; [self.navigationController presentViewController:navController animated:YES completion:nil];
Если вы не задали свойство modalPresentationStyle (например, UIModalPresentationFormSheet), панель навигации будет отображаться всегда. Чтобы убедиться, всегда делайте
[[self.navigationController topViewController] presentViewController:vieController animated:YES completion:nil];это будет показывать панель навигации всегда.
Если вы используете NavigationController в Swift 2.x
let storyboard = UIStoryboard(name: "Main", bundle: nil) let targetViewController = storyboard.instantiateViewControllerWithIdentifier("targetViewControllerID") as? TargetViewController self.navigationController?.pushViewController(targetViewController!, animated: true)
попробуй такое
let transition: CATransition = CATransition() let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) transition.duration = 1 transition.timingFunction = timeFunc transition.type = kCATransitionPush transition.subtype = kCATransitionFromRight self.view.window!.layer.addAnimation(transition, forKey: kCATransition) self.presentViewController(vc, animated:true, completion:nil)
Swift версия : Это представляет собой ViewController, который встроен в навигационный контроллер.
override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) // Identify the bundle by means of a class in that bundle. let storyboard = UIStoryboard(name: "Storyboard", bundle: NSBundle(forClass: SettingsViewController.self)) // Instance of ViewController that is in the storyboard. let settingViewController = storyboard.instantiateViewControllerWithIdentifier("SettingsVC") let navController = UINavigationController(rootViewController: settingViewController) presentViewController(navController, animated: true, completion: nil) }
Я использую этот код. Он отлично работает в iOS 8.
MyProfileEditViewController *myprofileEdit=[self.storyboard instantiateViewControllerWithIdentifier:@"myprofileeditSid"]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myprofileEdit]; [self presentViewController:navigationController animated:YES completion:^{}];
Comments