BraveTabbarController
BraveTabbarController 是为 UITabbarController 提供的 swift 代码的替代品。虽然 UITabbarController 用得不错,但自定义起来并不容易。例如:如果您想自定义标签栏图标,您必须遵循 Apple 的设计指南,这很复杂。此外,UITabbarController 用在 Storyboard 中很好,但在 xib 中就不太好了。BraveTabbarController 的创建是为了模仿 UITabbarController,但让开发者摆脱了 Apple 的复杂设计指南。
示例
要运行示例项目,请先克隆仓库,然后从 Example 目录运行 pod install
。
要求
- iOS 9.0+
安装
BraveTabbarController 可通过 CocoaPods 获取。要想安装它,请首先在 Podfile 中添加以下行:
pod 'BraveTabbarController'
使用
如何创建
将您的视图控制器继承为BraveTabbarController。在您的视图控制器中应该有2个以下组件
- 供切换选中标签页的按钮。
- 内容视图,作为显示选中标签页内容的容器。
设置标签栏按钮
- 首先,将每个标签栏按钮的tag值设置为递增的不同值。
- 然后,将每个标签栏按钮的IBOutlet连接拖入属性
tabButtons
。
设置标签栏内容
- 在 viewDidLoad 方法中,创建一个视图控制器数组并将其设置到 BraveTabbarController 的 viewControllers 属性中。以下是一个示例
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
var viewControllers : Array<UIViewController> = Array();
for i in 0..<3 {
var vc : UIViewController
switch (i) {
case 0:
vc = RankingViewController(nibName: String(describing: RankingViewController.self), bundle:nil)
break
case 1:
vc = PostViewController(nibName: String(describing: PostViewController.self), bundle:nil)
break
case 2:
vc = MyPageViewController(nibName: String(describing: MyPageViewController.self), bundle:nil)
break;
default:
vc = UIViewController();
vc.view.backgroundColor = UIColor(red: CGFloat(Float(arc4random()) / Float(UINT32_MAX)), green: CGFloat(Float(arc4random()) / Float(UINT32_MAX)), blue: CGFloat(Float(arc4random()) / Float(UINT32_MAX)), alpha: 1);
vc.title = String(format: "Tab %d", i + 1)
break;
}
viewControllers.append(vc)
}
self.viewControllers = viewControllers
}
就是这样,这里有一个视频演示了上述设置(这是针对objective c的版本,但步骤是这样的)
注意:
- 上面的流程只是一种可选的设置方式。您不必总是使用这种方式。相反,您可以探索代码以执行适合您自己目的的初始化。
- 如果您想使 BraveTabbarController 继承其他类,请创建一个包装视图控制器,将 BraveTabbarController 添加为子视图控制器,然后继承包装器。
访问祖先
类似于 UITabbarController
,BraveTabbarController
也提供了一种扩展,可以通过属性 braveTabBarController
来从子元素中检索 tab bar controller。
extension UIViewController {
/**
The nearest ancestor in the view controller hierarchy that is BraveTabbarController.
*/
open var braveTabBarController: BraveTabbarController? { get }
}
回到根目录
当点击 tab 按钮时,你可能希望对应的导航控制器弹出到根目录,即 BraveTabbarController
。当此属性为 true
时,当前选中视图控件的 tab 按钮被点击,且选中视图控制器是导航控制器。然后选中的导航控制器将自动弹出到根目录。默认值为 true
。如果你需要更多的自定义,可以将它设置为 false
并重写方法 onTabClick
或代理方法 shouldSelectAtIndex
。
自定义
BraveTabbarController
提供了 BraveTabbarControllerDelegate
协议,当你想增强 tab bar 的行为时可以使用它。特别是,你可以用它来决定是否应该选中特定的标签,在选择标签后执行操作。在你的自定义对象中实现这些方法后,你应该将该对象赋值给相应的 BraveTabbarController
对象的代理属性。
@objc public protocol BraveTabbarControllerDelegate: NSObjectProtocol {
/**
Asks the delegate whether the specified index should be selected.
*/
@objc optional func tabBarController(_ tabBarController: BraveTabbarController, shouldSelectAtIndex selectedIndex: Int) -> Bool
/**
Tells the delegate that the user selected an item in the tab bar.
*/
@objc optional func tabBarController(_ tabBarController: BraveTabbarController, didSelectAtIndex selectedIndex: Int)
}
参考资料
以下是你可以使用的所有公共属性和方法列表
viewControllers
:表示 tab bar 接口显示的根视图控制器数组。selectedIndex
:与当前选中 tab 项关联的视图控制器的索引。delegate
:tab bar controller 的代理对象。tabButtons
:用于 tab 按钮的出口。确保按递增顺序设置按钮的标记,以便正确处理选中的 tab 按钮。contentViewContainer
:用于 tabbar选中内容的容器。onTabClick
:点击 tab 项时的事件。你可以重写此方法以进行自定义。selectedViewController
:与当前选中 tab 项关联的视图控制器,只读。
作者
Pham Hien,[email protected]
许可协议
BraveTabbarController 在 MIT 许可证下可用。更多信息请参阅 LICENSE 文件。