如何全局设置Toolbar Items的ImageInsets属性?
解决TabBarItem图片内边距无法全局设置的问题
我之前也碰到过一模一样的坑!一开始想在AppDelegate里直接给TabBar的Item设置图片内边距,写了这段代码:
self.window?.rootViewController?.tabBarController?.toolbarItems![0].imageInsets.top = 5.0 self.window?.rootViewController?.tabBarController?.toolbarItems![1].imageInsets.top = 5.0
结果运行后完全没效果,查了半天发现这时候tabBarController还是nil,根本拿不到实例。
没办法,只能退而求其次,在第一个视图控制器的viewDidLoad里给自己的TabBarItem设置属性,这时候倒是能生效:
override func viewDidLoad() { super.viewDidLoad() self.tabBarItem.imageInsets.top = 5.0 }
但新问题又来了——第二个视图控制器在用户点击对应的TabBar按钮之前根本不会加载,所以它的TabBarItem属性没法提前设置,导致切换过去的时候样式不一致。
推荐的解决办法
其实我们可以直接在UITabBarController的子类里做全局配置,这样不管子控制器有没有被加载,都能统一设置所有TabBarItem的样式:
- 先创建一个自定义的
UITabBarController子类,比如叫MainTabBarController - 在这个子类的
viewDidLoad方法里,遍历所有子控制器,统一设置图片内边距:
class MainTabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() // 遍历所有子控制器,给每个tabBarItem设置统一的内边距 viewControllers?.forEach { viewController in viewController.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0) } } }
这样只要TabBarController完成初始化,所有对应的TabBarItem就都会被设置好属性,不用等到子控制器加载,完美解决了之前的问题。
内容的提问来源于stack exchange,提问作者Houman
相关产品推荐
相关产品推荐

