框架扩展

一、工具栏
1.1 不正规样式的tabBarItem
1.继承UITabBarController,创建规则试图控制器

  class MainTabBarController: UITabBarController, UINavigationControllerDelegate {
        var tarbarVCArr = [UINavigationController]()           
        //创建视图控制器
        private func createControllers(){
              //初始化导航控制器数组
              let vcArray = [MessageViewController(), MyProblemViewController(), CommonProblemViewController(), MineViewController()]
              for (_, value) in vcArray.enumerated() {
                let navc = BaseNavigationController(rootViewController:value)
                navc.delegate = self
                tarbarVCArr.append(navc)
              }
            //设置标签栏控制器数组
          self.viewControllers = tarbarVCArr
      }
  }

2.自定义TabBarView

     //循环创建你需要的item按钮,默认选择第一个按钮
    let screenW = UIScreen.main.bounds.size.width
    let itemWidth:CGFloat = (screenW-56) / 4
    let centerWidth:CGFloat = 56
    for i in 0..<5{
        var itemFrame:CGRect
        if i == 2 {
            itemFrame = CGRect(x: itemWidth*2 , y: -16, width: centerWidth, height: centerWidth)
        }else if i < 2 {
            itemFrame = CGRect(x: itemWidth*CGFloat(i) , y: 0, width: itemWidth, height: frame.size.height)
        }else {
            itemFrame = CGRect(x: itemWidth*CGFloat(i-1)+centerWidth, y: 0, width: itemWidth, height: frame.size.height)
        }
        //创建Item视图
        let itemView = MainTabBarItem(frame: itemFrame, itemIndex: i)
        self.addSubview(itemView)
        self.itemArray.append(itemView)
        //添加事件点击处理
        itemView.tag = i
        itemView.addTarget(self, action:#selector(self.didItemClick(item:))  , for: UIControl.Event.touchUpInside)
        
        //默认点击第一个,即首页
        if i == 0 {
            self.didItemClick(item: itemView)
        }
        if i == 2 {
            itemView.clipsToBounds = true
            self.btn = itemView
        }
    }

3.设置自定义TabBarView的代理事件与tabBarcontroller建立联系

   //item按钮点击事件执行代理传递到tabBarcontroller上
  self.delegate?.didChooseItem(itemIndex: item.tag)

然后在tabBarcontroller执行代理方法,设置选中的item

//MARK: - MainTabBarDelegate
func didChooseItem(itemIndex: Int) {
    self.selectedIndex = itemIndex
}

2.2 在tabBarItem上显示消息数量
以下是tabBar 的现实数据的扩展,添加数据只需要执行showBadgeOnItem方法,隐藏则执行hideBadgeOnItem方法即可。

extension UITabBar {
  func showBadgeOnItem(index:Int, count:String) {
      removeBadgeOnItem(index: index)
      let bview = UIView.init()
      bview.tag = 888+index
      bview.layer.cornerRadius = 3
      bview.clipsToBounds = true
      bview.backgroundColor = UIColor.red
      let tabFrame = self.frame
      
      let percentX = (Float(index)+0.6)/4.0
      let x = CGFloat(ceilf(percentX*Float(tabFrame.width)))
      let y = CGFloat(ceilf(0.1*Float(tabFrame.height)))
      bview.frame = CGRect(x: x, y: y, width: 6, height: 6)
      
//        let cLabel = UILabel.init()
//        cLabel.text = count
//        cLabel.frame = CGRect(x: 0, y: 0, width: 6, height: 6)
//        cLabel.font = UIFont.systemFont(ofSize: 10)
//        cLabel.textColor = UIColor.white
//        cLabel.textAlignment = .center
//        bview.addSubview(cLabel)
      
      addSubview(bview)
      bringSubviewToFront(bview)
  }
  //隐藏红点
  func hideBadgeOnItem(index:Int) {
      removeBadgeOnItem(index: index)
  }
  //移除控件
  func removeBadgeOnItem(index:Int) {
      for subView:UIView in subviews {
          if subView.tag == 888+index {
              subView.removeFromSuperview()
          }
      }
  }
}

二、导航栏
2.1、返回按钮自定义:

class BaseNavigationController: UINavigationController, UIGestureRecognizerDelegate {
      override func pushViewController(_ viewController: UIViewController, animated: Bool) {
         if children.count > 0 {
             let button = UIButton.init(type: .custom)
             button.frame.size = CGSize.init(width: 40.0, height: 30.0)
             button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 17)
             button.setImage(UIImage(named: "BackBtnNormal"), for: .normal)
             button.setImage(UIImage(named: "BackBtnNormal"), for: .selected)
             // 设置按钮内容左对齐
             button.contentHorizontalAlignment = .left
           
             // 设置按钮字体颜色
             button.addTarget(self, action: #selector(dc_back), for: .touchUpInside)
             viewController.navigationItem.leftBarButtonItem = UIBarButtonItem.init(customView: button)
         }
         super.pushViewController(viewController, animated: animated)
     }
     @objc fileprivate func dc_back() {
         super.popViewController(animated: true)
     }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容