在UITabBarController内首次启动时具有自动布局的问题

问题描述 投票:0回答:1

我有一个带有四个屏幕的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()中设置。

问题图片(查看屏幕顶部):issue

当我导航到另一个页面时,约束似乎起作用:different screen working

然后,当我导航回到第一个屏幕时,它现在可以工作:original screen working

[如果有人可以帮助我解决这个问题,我将不胜感激!

ios swift autolayout uitabbarcontroller
1个回答
0
投票

我刚刚制作了一个最小的项目,在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属性,更重要的是,您将免费获得所有标题动画!

© www.soinside.com 2019 - 2024. All rights reserved.