ビューコントローラーの階層があり、最上位のコントローラーがモーダルとして表示され、使用時にナビゲーションバーを表示する方法を知りたい
'UIViewController:presentViewController:viewControllerToPresent:animated:completion'
「presentViewController:animated:completion:」のドキュメント注:
'iPhoneおよびiPod touchでは、表示されるビューは常にフルスクリーンです。 iPadでは、プレゼンテーションはmodalPresentationStyleプロパティの値に依存します。
「modalPresentationStyle」の場合、ドキュメントには次のように記載されています。
表示スタイルにより、モーダル表示されたView Controllerが画面に表示される方法が決まります。 iPhoneおよびiPod touchでは、モーダルビューコントローラーは常にフルスクリーンで表示されますが、iPadではいくつかの異なる表示オプションがあります。
ビューコントロールが表示されると、ナビゲーションバーがステータスバーの下に表示されるようにする方法はありますか?このドキュメントを、iPhone/iPodのオプションはなく、iPadのみで解釈できると解釈すべきですか?
以前は、'UIViewController:presentModalViewController:animated'
を使用していましたが、正常に機能していましたが、iOS 5.0以降、APIは廃止されているため、新しい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];
IPhoneでモーダルモードでView Controllerを表示する場合、Navigation Controllerのトップビューコントローラーで表示する方法やその他の方法に関係なく、常に全画面表示されます。ただし、次の回避方法でナビゲーションバーをいつでも表示できます。
View Controllerをモーダルモードで表示するのではなく、ルートView ControllerをView Controllerとして設定してNavigation Controllerをモーダルモードで表示します。
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 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.
ナビゲーション:
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: ^ {
}];
}
スイフト3
let vc0 : ViewController1 = ViewController1()
let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
self.present(vc2, animated: true, completion: nil)
[self.navigationController pushViewController:controller animated:YES];
は、トランジションをアニメーション化して、それをNavigation Controllerスタックやその他のクールなナビゲーションバーアニメーションに追加するだけです。バーのアニメーションを気にしない場合、このコードshouldは機能します。新しいコントローラーにバーが表示され、インタラクティブなポップジェスチャが表示されます!
//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などを使用してカスタムトランジションを作成し、トランジションでコントローラーをアニメーション化してから、それをnavigationControllerのviewControllersに追加する必要があります。
このコードを使用します。 iOS 8では正常に動作しています。
MyProfileEditViewController *myprofileEdit=[self.storyboard instantiateViewControllerWithIdentifier:@"myprofileeditSid"];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myprofileEdit];
[self presentViewController:navigationController animated:YES completion:^{}];
Swiftバージョン:これは、Navigation Controllerに埋め込まれた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)
}
Swift 2.xでNavigationControllerを使用する場合
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)
ModalPresentationStyleプロパティを設定しなかった場合(UIModalPresentationFormSheetなど)、ナビゲーションバーは常に表示されます。確実にするために、常に
[[self.navigationController topViewController] presentViewController:vieController
animated:YES
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];