一、工具栏
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)
}
}