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

时间:2013-08-14 09:02:26

标签: ios uitabbarcontroller

我可以使用UINavigationController创建一个包含自定义栏类的initWithNavigationBarClass:toolbarClass:。似乎没有UITabBarController的等效项,那么如何让它使用自定义UITabBar类?

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

  1. 使用IB
  2. 它向UITabBarController添加第二个标签栏,而不是更改现有标签栏,或
  3. 抛出UITabBarController并创建一个新的控制器类。
  4. 我想在代码中使用自定义类为其标签栏创建一个真正的UITabBarController。我如何实现这一目标?

4 个答案:

答案 0 :(得分:10)

这太难了!我提出的最好的是继承init,然后在super.init(nibName: nil, bundle: nil) object_setClass(self.tabBar, CustomTabBar.self) (self.tabBar as? CustomTabBar)?.setup() 中执行此操作:

super.init

不幸的是,您无法在调用init之前设置类(不管是在Swift中),所以当您更改类时,setup()方法已经运行并且因此不会在您的自定义子类上调用。为了解决这个问题,我刚刚添加了UITabBar方法来进行所有自定义。

Swift的另一个选择是扩展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

但是这会影响<?php require_once "vendor/autoload.php"; use garethp\ews\API\Type; use garethp\ews\MailAPI; $api = MailAPI::withUsernameAndPassword('server', 'username', 'password'); $mail = $api->getMailItems(); foreach ($mail as $mailItem) { $mailItem = $api->getItem($mail->getItemId()); $subject = $mailItem->getSubject(); $body = (string) $mailItem->getBody(); } 的所有实例,所以我更喜欢第一个选项。

答案 1 :(得分:1)

我认为不可能。

以下是关于tabBar的{​​{1}}属性的Apple文档。

  

您永远不应该尝试操纵UITabBar对象本身   存储在此属性中。如果您尝试这样做,请使用标签栏视图   抛出一个例外。配置标签栏的项目   在界面中,您应该改为分配一个或多个自定义视图   控制器到viewControllers属性。标签栏收集   您指定的视图控制器中需要的标签栏项目。

     

此属性提供的标签栏视图仅适用于某些情况   要使用showFromTabBar显示操作表的位置:   UIActionSheet类的方法。

答案 2 :(得分:1)

据我所知你不能这样做。没有IB的最佳选择是拥有自己的UIViewController(不是子类化UITabBarController),然后将自己的UITabBar子类添加到该Controller。

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

答案 3 :(得分:1)

此解决方案来自 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")
}