tabBar的定制
class YTTabBarController: UITabBarController {
//MARK: - 屬性
lazy var yt_tabBar:YTTabBar = {
//自己定義的tabBar的大小和系統(tǒng)自帶的tabBar的大小一樣
let tempTabBar = YTTabBar(frame:self.tabBar.bounds)
//點(diǎn)擊tabBar上的按鈕去切換視圖控制器
tempTabBar.changeSelectedIndex = {(index)in
//切換到指定的視圖控制器
self.selectedIndex = index
}
//將自定義的tabBar貼到系統(tǒng)的tabBar上
self.tabBar.addSubview(tempTabBar)
return tempTabBar
}()
//MARK: - 生命周期
override func viewDidLoad() {
super.viewDidLoad()
self.selectedIndex = 0
//創(chuàng)建子視圖控制器
self.addController(OneViewController(), title: "one", imageName: "tiaoman_u", selectImageName: "despicable-me-2-minion-icon-5.png")
self.addController(TwoViewController(), title: "two", imageName: "huiben_u", selectImageName: "despicable-me-2-minion-icon-4.png")
self.addController(ThereViewController(), title: "there", imageName: "zhuanti_u", selectImageName: "despicable-me-2-minion-icon-3.png")
self.addController(FourViewController(), title: "four", imageName: "wode_u", selectImageName: "despicable-me-2-minion-icon-2.png")
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
//設(shè)置默認(rèn)選中的按鈕
self.yt_tabBar.selectedIndex = self.selectedIndex
//改變文字顏色
self.yt_tabBar.titleColor = UIColor.lightGrayColor()
//移除tabBar上自動(dòng)添加的所有的子視圖
for item in self.tabBar.subviews {
//判斷子視圖的類型是否是YTTabBar
//isKindOfClass判斷指定的對(duì)象是否是指定的類型
if item.isKindOfClass(YTTabBar.self) {
continue
}
//將不是YTTabBar的從系統(tǒng)的tabBar上移除
item.removeFromSuperview()
}
}
}
//MARK: - 添加子視圖控制器
extension YTTabBarController{
///添加子視圖控制器
func addController(controller:UIViewController,title:String,imageName:String,selectImageName:String){
//設(shè)置視圖控制器對(duì)一個(gè)的tabBarItem
controller.tabBarItem.title = title
controller.tabBarItem.image = UIImage.init(named: imageName)?.imageWithRenderingMode(.AlwaysOriginal)
controller.tabBarItem.selectedImage = UIImage.init(named: selectImageName)?.imageWithRenderingMode(.AlwaysOriginal)
//將視圖控制器添加到tabBarController中
self.addChildViewController(controller)
//在yt_tabBar上創(chuàng)建對(duì)應(yīng)按鈕
self.yt_tabBar.addButtonWithItem(controller.tabBarItem)
}
}
==============TabBar的定制========================
class YTTabBar: UIView {
//MARK: - 屬性
///1.當(dāng)前選中的下標(biāo)
var selectedIndex = 1
///2.聲明閉包用來(lái)傳值
var changeSelectedIndex:((Int)->Void)? = nil
///3.設(shè)置按鈕的文字顏色
var titleColor = UIColor.blackColor()
}
//MARK: - 添加按鈕
extension YTTabBar{
///添加按鈕
func addButtonWithItem(item:UITabBarItem) {
//創(chuàng)建按鈕
let btn = YTTabBarButton(tabBarItem: item)
//添加點(diǎn)擊事件
btn.addTarget(self, action: "btnAction:")
//設(shè)置按鈕的tag值
btn.tag = 100+self.subviews.count
// //判斷是否是需要選中按鈕
// if self.selectedIndex == self.subviews.count{
//
// btn.isSelected = true
// }
//添加到界面上
self.addSubview(btn)
}
}
//MARK: - 按鈕點(diǎn)擊
extension YTTabBar{
func btnAction(btn:YTTabBarButton){
//將原來(lái)處于選中狀態(tài)的按鈕變成非選中狀態(tài)
let selectBtn = self.viewWithTag(100+self.selectedIndex) as! YTTabBarButton
selectBtn.isSelected = false
//將當(dāng)前按下的按鈕變成選中狀態(tài)
btn.isSelected = true
//更新選中下標(biāo)
self.selectedIndex = btn.tag - 100
//通知tabBarController切換視圖控制器
self.changeSelectedIndex!(self.selectedIndex)
}
}
//MARK: - 計(jì)算子視圖的frame
extension YTTabBar{
override func layoutSubviews() {
super.layoutSubviews()
//通用
let btnW = self.frame.size.width / CGFloat(self.subviews.count)
let btnH = self.frame.size.height
let btnY:CGFloat = 0
//遍歷拿到所有的按鈕
for (i,item) in self.subviews.enumerate() {
let btn = item as! YTTabBarButton
let btnX = CGFloat(i) * btnW
//1.設(shè)置frame
item.frame = CGRectMake(btnX, btnY, btnW, btnH)
//2.設(shè)置默認(rèn)選中的按鈕
if i == self.selectedIndex {
btn.isSelected = true
}
//3.設(shè)置按鈕顏色
btn.titleLabel.textColor = self.titleColor
}
}
}
==========button的定制=================
//自定義控件:
//1.聲明所有的子視圖的屬性
//2.在構(gòu)造方法中將子視圖添加到界面上
//3.計(jì)算子視圖的frame
//1.小圖
//2.文字
//3.大圖
class YTTabBarButton: UIView {
//MARK: - 屬性
//1.小圖
let smallImageView = UIImageView()
//2.文字
let titleLabel = UILabel()
//3.大圖
let bigImageView = UIImageView()
///4.按鈕的狀態(tài)
var isSelected = false{
didSet{
if isSelected == true {
self.bigImageView.hidden = false
}else{
self.bigImageView.hidden = true
}
}
}
//5.保存添加事件相關(guān)屬性
var target: AnyObject? = nil
var action: Selector? = nil
//MARK: - 構(gòu)造方法
init(tabBarItem:UITabBarItem){
super.init(frame: CGRectZero)
//1.小圖
self.addSubview(self.smallImageView)
self.smallImageView.image = tabBarItem.image
self.smallImageView.contentMode = .Center
//2.文字
self.addSubview(self.titleLabel)
self.titleLabel.text = tabBarItem.title
self.titleLabel.textAlignment = .Center
//3.大圖
self.addSubview(self.bigImageView)
self.bigImageView.image = tabBarItem.selectedImage
self.bigImageView.contentMode = .Center
self.bigImageView.hidden = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//MARK: - 添加點(diǎn)擊事件
extension YTTabBarButton{
///添加事件
func addTarget(target:AnyObject,action:Selector){
self.target = target
self.action = action
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if self.target == nil {
return
}
if (self.target!.respondsToSelector(self.action!) == true){
self.target!.performSelector(self.action!, withObject: self)
}else{
print("按鈕點(diǎn)擊方法沒有實(shí)現(xiàn)")
}
}
}
//MARK: - 計(jì)算frame
extension YTTabBarButton{
override func layoutSubviews() {
super.layoutSubviews()
//通用
let btnW = self.frame.size.width
let btnH = self.frame.size.height
let imageProportion = CGFloat(4)/5
let beyondH:CGFloat = 25
//1.小圖
let smallX:CGFloat = 0
let smallY:CGFloat = 0
let smallW = btnW
let smallH = btnH * imageProportion
self.smallImageView.frame = CGRectMake(smallX, smallY, smallW, smallH)
//2.文字
let titleX: CGFloat = 0
let titleY: CGFloat = smallH
let titleW = btnW
let titleH = btnH * (1 - imageProportion)
self.titleLabel.frame = CGRectMake(titleX, titleY, titleW, titleH)
//3.大圖
let bigX: CGFloat = 0
let bigY = -beyondH
let bigW = btnW
let bigH = btnH + beyondH
self.bigImageView.frame = CGRectMake(bigX, bigY, bigW, bigH)
//判斷當(dāng)前按鈕是否處于選中狀態(tài)
if self.isSelected {
self.bigImageView.hidden = false
}
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者