安全区域在自定义 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()
在我的应用程序 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()