BraveTabbarController 1.1.7

BraveTabbarController 1.1.7

Hien PhamHien Pham 维护。



  • By
  • Hien Pham

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个以下组件

  1. 供切换选中标签页的按钮。
  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的版本,但步骤是这样的)
IMAGE ALT TEXT HERE

注意:

  • 上面的流程只是一种可选的设置方式。您不必总是使用这种方式。相反,您可以探索代码以执行适合您自己目的的初始化。
  • 如果您想使 BraveTabbarController 继承其他类,请创建一个包装视图控制器,将 BraveTabbarController 添加为子视图控制器,然后继承包装器。

访问祖先

类似于 UITabbarControllerBraveTabbarController 也提供了一种扩展,可以通过属性 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 文件。