在视图控制器加载之前运行tabBarItem代码

时间:2018-04-17 00:58:22

标签: ios swift uitabbarcontroller uitabbar

我有一个tabbar应用程序,我将以下代码放在我的视图控制器中:

let orientation = UIDevice.current.orientation

if orientation == .portrait {
    self.tabBarItem.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: -17.0) 
} else if orientation == .landscapeLeft || orientation == .landscapeRight {
    self.tabBarItem.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: 0.0) // updating the title positon
}

这会更改我的标签栏项目的偏移量。标题。在横向中,偏移会自动反转,因此我必须手动完成。这是有效的,但只有当您实际单击选项卡栏项并加载视图控制器时才会有效。

我想在开始时加载此代码,因此它会在您启动应用程序时(在视图控制器加载之前)更改偏移量。以下是一些描述我所说内容的图片:

首次启动应用时,这是第一个视图控制器,因此它会加载该代码并更改位置:

initial result - only the first tab bar item is in the correct position

如果点击第二个项目,第二个视图控制器会加载,它也会改变位置。

second tab bar item in the correct position

我需要为每个标签栏项加载此代码,因此它从头开始看起来像这样:

desired result

2 个答案:

答案 0 :(得分:1)

您应该继承UITabBarController并执行在控制器加载(viewDidLoad)之后以及每次视图大小/方向更改(viewWillTransition)时更改标题位置调整的代码。 / p>

class CustomTabBarController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()

        tabBarItemsUI()
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)

        coordinator.animate(alongsideTransition: { [weak self] context in
            self?.tabBarItemsUI()
        })
    }

    fileprivate func tabBarItemsUI() {
        let isLandscape = [.landscapeLeft, .landscapeRight].contains(UIDevice.current.orientation)
        tabBar.items?.forEach { $0.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: isLandscape ? 0 : -17) }
    }
}

答案 1 :(得分:0)

尝试在viewWillAppear()函数中运行此代码。