Проблема с автоматической компоновкой при первом запуске в UITabBarController - PullRequest
0 голосов
/ 17 июня 2020

У меня есть UITabBarController с четырьмя экранами в нем типа «BaseViewController», который является очень простым подклассом UIViewController, который будет содержать заголовок, отображающий UILabel, который означает, на каком экране находится пользователь. Например, когда пользователь щелкает вкладку «Главная» на tabBar, метка будет читать «ДОМ»

Код для 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
    }

Ярлык работает нормально, но у меня проблема начинается при запуске приложения. Главный экран, который является контроллером root для UITabBarController, похоже, игнорирует эти ограничения автоматической компоновки UILabel. Очевидно, что на каждом экране текст метки установлен в viewDidLoad().

Изображение проблемы (см. Верхнюю часть экрана): issue

Кажется, что ограничения работают, когда я перехожу на другую страницу: different screen working

Затем, когда я возвращаюсь к первому экрану, теперь он работает: original screen working

Если кто-нибудь может помочь мне разобраться в этой проблеме, я был бы очень признателен!

1 Ответ

0 голосов
/ 17 июня 2020

Я только что сделал минимальный проект, протестировал его на 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"
    }
}

// ...

Мне интересно, как вы установите root контроллер представления окна вашего приложения, потому что это может быть проблемой здесь.

Вы используете safeAreaLayoutGuide, чтобы ограничить вид сверху, чтобы он будет хорошо смотреться на любых устройствах (потому что у вас уже установлена ​​высота 50). базовый класс и размещение метки наверху - определенно не лучший подход, и на самом деле я бы не рекомендовал вам это делать.

Причина в том, что вы пытаетесь сделать как раз роль панели навигации .

Если вы хотите, чтобы панель навигации соответствовала стилю вашего экрана, чтобы она выглядела так же, как ваш снимок экрана, это довольно просто, и вы можете просто изменить цвет фона панели навигации на прозрачный, например .

Нет необходимости в базовом классе, вы можете просто установить свойство title вашего контроллера представления, и, что более важно, вы получите все анимации заголовков бесплатно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...