如何在不使用IB的情况下使用自定义UITabBar类创建UITabBarController?

Sim*_*mon 15 uitabbarcontroller ios

我可以使用创建一个UINavigationController自定义栏类initWithNavigationBarClass:toolbarClass:.似乎没有相应的UITabBarController,所以如何让它使用自定义UITabBar类?

到目前为止我看到的每个解决方案都不合适,因为它们也是如此

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

我希望UITabBarController在代码栏中使用自定义类创建一个真正的代码.我该如何实现这一目标?

Luk*_*ers 12

这真是太难了!我提出的最好的是子类化UITabBarController,然后在以下内容中执行此操作init:

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

object_setClass(self.tabBar, CustomTabBar.self)
(self.tabBar as? CustomTabBar)?.setup()
Run Code Online (Sandbox Code Playgroud)

不幸的是,你无法在调用之前设置类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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Sup*_*mon 6

该解决方案来自ESTabBarControlller,用于替换没有 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")
}
Run Code Online (Sandbox Code Playgroud)