安全区域在自定义 TabBarController 中不起作用 ViewController

Safe area not working in custom TabBarController's ViewController

在我的应用程序 AppDelegate 的 didFinishLaunchingWithOptions 中,在初始化我的 UIWindow 属性 之后,我将根控制器设置为 UITabBarController 的子类,我在其中设置了视图控制器(以及一些其他自定义行为)。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = TabBarController() // a subclass of UITabBarController
    self.window?.makeKeyAndVisible()

    return true
}

我遇到的问题是 TabBarController 的视图控制器中的安全区域似乎无法正常工作。

例如:将视图粘贴到视图控制器视图的底部,使用它的 safeAreaLayoutGuide,位于选项卡栏后面。

self.bottomView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor)

自定义行为(例如设置色调颜色、设置 viewController 及其选项卡栏项目,或设置 tabBarController 的委托 - 这里没有什么疯狂的)设置是在 viewDidLoad 中进行的。

注意:我只从事代码工作,不使用界面生成器。

无法重现。这是项目中视图控制器的完整代码,它执行您似乎描述的操作:

class FirstViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let v = UIView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .red
        self.view.addSubview(v)
        v.widthAnchor.constraint(equalToConstant: 100).isActive = true
        v.heightAnchor.constraint(equalToConstant: 100).isActive = true
        v.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
        v.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    }
}

这是结果;红色方块出现在我们期望看到的位置,固定在标签栏的顶部:

问题在于我以编程方式呈现选项卡栏控制器的方式。 我在 AppDelegate 的 didFinishLaunchingWithOptions 中所做的是:

    self.window?.rootViewController = MyTabBarController()
    self.window?.makeKeyAndVisible()

我解决了将标签栏放入 NavigationController 中的问题:

    let navigationController = UINavigationController(rootViewController: MyTabBarController())
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()