我有一个带有四个屏幕的UITabBarController
,类型为“ BaseViewController”,这是UIViewController
的一个非常简单的子类,它将包含显示UILabel
的标题,该标题指示用户所在的屏幕。例如,当用户单击tabBar
上的主页选项卡时,标签将显示为“ HOME”
BaseViewController
的代码:
class BaseViewController: UIViewController {
let screenIndicationLabel: UILabel = {
let label = UILabel()
label.setAttrs(font: "bold", size: 25.0, color: .black)
label.textAlignment = .center
return label
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(screenIndicationLabel)
screenIndicationLabel.translatesAutoresizingMaskIntoConstraints = false
screenIndicationLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
screenIndicationLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
screenIndicationLabel.heightAnchor.constraint(equalToConstant: 50.0).isActive = true
}
}
UITabBarController
的代码:
class MainTabController: UITabBarController {
let home = HomeController()
let browse = BrowseController()
let bag = BagController()
let settings = SettingsController()
override func viewDidLoad() {
super.viewDidLoad()
self.viewControllers = [home, browse, bag, settings]
self.selectedIndex = 0
self.tabBar.barTintColor = Colors.pink
self.tabBar.unselectedItemTintColor = Colors.darkPink
self.tabBar.tintColor = Colors.darkGrey
home.tabBarItem = homeTab
browse.tabBarItem = browseTab
bag.tabBarItem = bagTab
settings.tabBarItem = settingsTab
}
标签工作正常,但是启动应用程序后我的问题开始了。主屏幕是UITabBarController
的根控制器,似乎忽略了UILabel
的这些自动布局约束。显然,在每个屏幕中,标签的文本都在viewDidLoad()
中设置。
[如果有人可以帮助我解决这个问题,我将不胜感激!
我刚刚制作了一个最小的项目,在iPhone 11 Pro Max上进行了测试,因为它是您在屏幕快照中使用的那个项目,并且它似乎可以按照您想要的方式工作:]
class BaseViewController: UIViewController { let titleLabel: UILabel = { $0.textAlignment = .center return $0 }(UILabel()) override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white view.addSubview(titleLabel) titleLabel.translatesAutoresizingMaskIntoConstraints = false titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true titleLabel.heightAnchor.constraint(equalToConstant: 50.0).isActive = true } } class MainTabController: UITabBarController { let home = ViewControllerA() let browse = ViewControllerB() let bag = ViewControllerC() let settings = ViewControllerD() override func viewDidLoad() { super.viewDidLoad() viewControllers = [home, browse, bag, settings] selectedIndex = 0 home.tabBarItem = UITabBarItem(title: "Home", image: nil, selectedImage: nil) browse.tabBarItem = UITabBarItem(title: "Browse", image: nil, selectedImage: nil) bag.tabBarItem = UITabBarItem(title: "Bag", image: nil, selectedImage: nil) settings.tabBarItem = UITabBarItem(title: "Settings", image: nil, selectedImage: nil) } } class ViewControllerA: BaseViewController { override func viewDidLoad() { super.viewDidLoad() titleLabel.text = "Home" } } // ...
我想知道您如何设置应用程序窗口的根视图控制器,因为这可能是这里的问题。
您正在使用safeAreaLayoutGuide
约束顶部的视图,因此在任何设备上看起来都很好(因为您已经将高度设置为50)。
话虽这么说,如果您想在所有选项卡屏幕的顶部都显示标题,我想说,使用基类并自行将标签放置在顶部绝对不是最佳方法,实际上我不建议您这样做。
原因是,您想要做的正是导航栏
的角色。[如果您希望导航栏与屏幕样式匹配,使其看起来与屏幕截图相同,这非常简单,例如,您可以简单地将导航栏的背景颜色更改为透明。
不需要基类,您只需设置视图控制器的title属性,更重要的是,您将免费获得所有标题动画!