我可以使用UINavigationController
创建一个包含自定义栏类的initWithNavigationBarClass:toolbarClass:
。似乎没有UITabBarController
的等效项,那么如何让它使用自定义UITabBar
类?
到目前为止我看到的每个解决方案都不合适,因为
UITabBarController
添加第二个标签栏,而不是更改现有标签栏,或UITabBarController
并创建一个新的控制器类。我想在代码中使用自定义类为其标签栏创建一个真正的UITabBarController
。我如何实现这一目标?
答案 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")
}