我在故事板中创建了一个包含三个视图的简单标签栏。标签栏效果很好,但是当我尝试通过选项卡中的按钮显示另一个视图控制器时,新视图将放置在整个屏幕上以及标签栏上。
这是我按下按钮时到目前为止呈现视图的方式:
@IBAction func buttonPressed(_ sender: UIButton) {
let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
self.present(newVC!, animated: true, completion: nil)
}
我的另一个想法是:
self.tabBarController?.present(vc!, animated: true, completion: nil)
但令我惊讶的是,这也不起作用。
那么如何在标签栏中显示另一个视图控制器(以便仍然显示底部栏)?
答案 0 :(得分:13)
当您以模态方式呈现视图控制器时,其呈现样式将为"全屏"默认情况下。你要做的就是让它在这种情况下只是覆盖屏幕的一部分(绘制呈现视图控制器的部分。
实现这一目标的一种方法是:
将呈现的视图控制器的modalPresentationStyle
设置为.currentContext或.overCurrentContext
在呈现模态的视图控制器中,将其definesContext
属性设置为true。
这些步骤可以通过在segue和视图控制器上设置属性在Interface Builder中完成,或者您可以修改代码以包含以下内容:
@IBAction func buttonPressed(_ sender: UIButton) {
let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
self.definesPresentationContext = true
newVC?.modalPresentationStyle = .overCurrentContext
self.present(newVC!, animated: true, completion: nil)
}
这些属性组合的作用是:
指明呈现的视图控制器,您希望它在非全屏上下文中显示(屏幕的某个特定部分)
表示呈现视图控制器是屏幕的一部分/您希望根据其绘制模态的上下文。
更多详情可在Apple Documentation
中找到答案 1 :(得分:1)
当您使用present方法时,ViewController以模态方式呈现并覆盖您的UITabBarConntroller。您可以将TabBar中的每个第一个视图控制器嵌入到UINavigationController中,然后使用方法pushViewController将其推入堆栈,而不是以模态方式显示视图。您将免费获得TabBar可见且美观的动画。
答案 2 :(得分:0)
在Xcode中,我使用Tabbed App模板创建了一个新项目来说明上面的解决方案。这将创建一个带有tabbar控制器和两个视图控制器的项目。我添加了一个标题为"查看页面的按钮"从故事板到第一个视图控制器并嵌入导航控制器。
在进行上述更改后,故事板将如下所示:
在FirstViewController.swift文件中,我使用以下代码为按钮创建了一个IBAction,它将创建另一个名为DetailViewController的视图控制器,标题为Favorites,背景颜色为橙色。我使用导航控制器通过将其推送到导航控制器堆栈来呈现它。
@IBAction func viewPageButtonTapped(_ sender: UIButton) {
print("viewPageButtonTapped")
let pinkViewController = DetailViewController()
pinkViewController.title = "Favorites"
pinkViewController.view.backgroundColor = UIColor.orange
navigationController?.pushViewController(pinkViewController, animated: true)
}
当我在模拟器上运行项目时,我得到了所需的结果。希望这有助于您提供一些想法。
答案 3 :(得分:0)
您应该在主上下文中显示视图控制器,而不是模态地显示它。 为此,而不是:
@IBAction func buttonPressed(_ sender: UIButton) {
let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
self.present(newVC!, animated: true, completion: nil)
}
通话以显示:
@IBAction func buttonPressed(_ sender: UIButton) {
let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
self.show(newVC!, sender: self)
}
答案 4 :(得分:-1)
在viewController中执行:
self.tabBarController?.present(nextViewController, animated: true/false, completion: {})