21

我可以UINavigationController使用initWithNavigationBarClass:toolbarClass:. 似乎没有等效的 for UITabBarController,那么如何让它使用自定义UITabBar类?

到目前为止,我看到的每个解决方案都不合适,因为

  1. 它使用 IB
  2. 它将第二个标签栏添加到UITabBarController而不是更改其现有的标签栏,或者
  3. UITabBarController扔掉并创建一个新的控制器类。

UITabBarController我想要使​​用自定义类为其标签栏在代码中创建一个真实的。我如何实现这一目标?

4

4 回答 4

21

这出乎意料的难!我想出的最好的方法是子类UITabBarController化,然后在init

super.init(nibName: nil, bundle: nil)

object_setClass(self.tabBar, CustomTabBar.self)
(self.tabBar as? CustomTabBar)?.setup()

不幸的是,您不能在调用之前设置类super.init(无论如何都不是在 Swift 中),因此当您更改类时,该init方法已经运行,因此不会在您的自定义子类上调用。为了解决这个问题,我刚刚添加了一个setup()方法来完成我的所有自定义。

Swift 中的另一个选项是扩展UITabBar并执行以下操作:

extension UITabBar {

    open override func willMove(toSuperview newSuperview: UIView?) {
        super.willMove(toSuperview: newSuperview)
        /// Customise in here.
    }

    // Modify the height.
    open override func sizeThatFits(_ size: CGSize) -> CGSize {
        return CGSize(width: size.width, height: 64.0)
    }
}

但是,这会影响 的所有实例UITabBar,所以我更喜欢第一个选项。

于 2016-09-30T09:17:34.610 回答
3

这个来自ESTabBarController的解决方案,用于替换没有 IB 的原生 UITabBar。

open override func viewDidLoad() {
    super.viewDidLoad()
    let tabBar = { () -> CustomTabBar in 
        let tabBar = CustomTabBar()
        tabBar.delegate = self
        return tabBar
    }()
    self.setValue(tabBar, forKey: "tabBar")
}
于 2021-02-18T10:20:51.867 回答
2

我不认为这是可能的。

这是谈论tabBar.UITabBarController

您永远不应尝试操作存储在此属性中的 UITabBar 对象本身。如果您尝试这样做,选项卡栏视图将引发异常。要为标签栏界面配置项目,您应该将一个或多个自定义视图控制器分配给 viewControllers 属性。标签栏从您指定的视图控制器中收集所需的标签栏项目。

此属性提供的选项卡栏视图仅适用于您希望使用 UIActionSheet 类的 showFromTabBar: 方法显示操作表的情况。

于 2013-08-14T09:15:46.433 回答
1

据我所知,你不能这样做。在没有 IB 的情况下执行此操作的最佳选择是拥有自己的 UIViewController(不是 UITabBarController 的子类),然后将您自己的 UITabBar 子类添加到该控制器。

如果您决定采用这种方法,您可能还需要查看控制器层次结构。

于 2013-08-14T09:20:32.970 回答