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

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

    Ничего не найдено.