PresentViewController и отображение панели навигации

У меня есть иерархия контроллера представления, а самый верхний контроллер отображается как модальный и хотел бы знать, как отображать панель навигации при использовании

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

Документы для "presentViewController: анимированные: завершение:" примечание:

'На iPhone и iPod touch представленный вид всегда полный экран. На iPad презентация зависит от ценности в modalPresentationStyle свойство. '

Для 'modalPresentationStyle', документы говорят:

Стиль презентации определяет, как на экране отображается отображаемый модально отображаемый контроллер. На iPhone и iPod touch контроллеры модального просмотра всегда представлены в полноэкранном режиме, но на iPad есть несколько различных вариантов презентации.

Есть ли способ убедиться, что панель навигации отображается под панелью состояния после того, как элемент управления представлением отображается сам? Должен ли я интерпретировать документ как, вы не получаете никаких опций 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];

Ответ 1

Это правда, что если вы представляете контроллер вида модально на 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:^{

                        }];

Вы должны увидеть панель навигации, когда ваш вид представлен модально.

Ответ 2

Swift 5.*

Навигация:

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)

Ответ 3

Можете ли вы использовать:

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

Возвращение (я думаю):

[self.navigationController popToRootViewControllerAnimated:YES];

Ответ 4

У меня была такая же проблема на 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: ^ {

    }];
}

Ответ 5

Все a [self.navigationController pushViewController:controller animated:YES]; выполняет анимирование перехода и добавляет его в стек навигационного контроллера и некоторые другие интересные элементы анимации навигационной панели. Если вам не нравится анимация бара, тогда этот код должен работать. Бар появляется на новом контроллере, и вы получаете интерактивный поп-жест!

//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.

Изменить: Извините, presentViewController заполнит весь экран. Вам нужно будет сделать настраиваемый переход, с CGAffineTransform.translation или что-то, оживить контроллер с переходом, а затем добавить его в controlController viewControllers.

Ответ 6

Swift 3

        let vc0 : ViewController1 = ViewController1()
        let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
        self.present(vc2, animated: true, completion: nil)

Ответ 7

Если вы не установили свойство modalPresentationStyle (например, UIModalPresentationFormSheet), панель навигации будет отображаться всегда. Чтобы обеспечить, всегда делайте

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

Это всегда отображает панель навигации.

Ответ 8

Одно решение

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

Ответ 9

Я использую этот код. В iOS 8 работает нормально.

MyProfileEditViewController *myprofileEdit=[self.storyboard instantiateViewControllerWithIdentifier:@"myprofileeditSid"];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myprofileEdit];
[self presentViewController:navigationController animated:YES completion:^{}];

Ответ 10

Если вы используете NavigationController в Swift 2.x

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let targetViewController = storyboard.instantiateViewControllerWithIdentifier("targetViewControllerID") as? TargetViewController
self.navigationController?.pushViewController(targetViewController!, animated: true)

Ответ 11

попробуйте это

     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)

Ответ 12

Быстрая версия: Это представляет собой 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)

}