【发布时间】:2021-02-12 05:36:45
【问题描述】:
我有一个单屏 ios 应用程序,我想添加第二个选项卡,所以我创建了一个单独的类 TabBarController 并将我的原始应用程序屏幕和一个新屏幕作为两个选项卡。
它工作正常,除了在我的单屏应用程序中,我在页面底部有一个元素锚定到安全区域,现在它被标签栏部分覆盖:
我正在以编程方式创建所有内容(我不擅长使用 UI,我忘记了所有内容在哪里)。
如何以编程方式将底部元素锚定到标签栏的顶部,而不是屏幕底部?我需要获取标签栏的引用,但是如何在子控制器中获取呢?
非常感谢!
编辑:
这是我原来的锚:
stackView.bottomAnchor.constraint(
equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
constant: VIEW_SPACER).isActive = true
现在我正在尝试:
stackView.bottomAnchor.constraint(
equalTo: self.tabBarController!.tabBar.topAnchor,
constant: VIEW_SPACER).isActive = true
我不明白我的子控制器如何引用 tabBarController,但显然它确实如此。但是使用它会导致崩溃。错误信息似乎是:
'Unable to activate constraint with anchors ... because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.
编辑2: 我设置控制器的方式:
class TabBarController: UITabBarController, UITabBarControllerDelegate {
...
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let firstViewController = ViewController()
let secondViewController = SettingsViewController()
let tabBarList = [firstViewController, secondViewController]
viewControllers = tabBarList
}
然后我将 TabBarController 设置为情节提要中的元素,以作为 root 实例化。
【问题讨论】:
-
请显示你做了什么,你可能没有从
safeArea底部添加约束。 -
谢谢@Rob。我已经添加了我的旧代码和我正在尝试的内容
-
当您没有将当前组件添加到
subview时会出现此错误。 -
哦等等。那个 VIEW_SPACER 应该在我的元素和底部之间放置一个间隙,但是我弄错了,不是吗?我正在添加 Y 值而不是从中减去。这不是我第一次这样做。谢谢@Rob,你给我指出了正确的地方。我已经改了,现在很好..
-
@Rob 我还是很好奇。我的子 ViewController 是如何引用 TabBar 的?
标签: ios swift autolayout