【问题标题】:How to disable tab bar label only in swift?如何仅在 swift 中禁用标签栏标签?
【发布时间】:2021-08-02 14:36:55
【问题描述】:

我有 5 个标签栏项目,中间有一个大圆形按钮,我想禁用这个大按钮的标签(锻炼),但标签的颜色不应该是做作的。我通过将标签值定义到锻炼项目栏来禁用锻炼选项卡栏选择。但它也禁用了按钮(+),但我只想禁用锻炼标签。我将如何实现这一目标?大家有什么意见,请帮帮我

标签栏控制器代码:

import UIKit
import SwiftIcons

class HomeViewController: UITabBarController, UITabBarControllerDelegate {

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
        
        let selectedColor   = UIColor(red: 16.0/255.0, green: 78.0/255.0, blue: 91.0/255.0, alpha: 1.0)
        let unselectedColor = UIColor(red: 16.0/255.0, green: 224.0/255.0, blue: 223.0/255.0, alpha: 1.0)

        UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: unselectedColor], for: .normal)
        UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: selectedColor], for: .selected)
        
            
        //store every image in a variable
        
        let userUnselectedImage: UIImage = UIImage(named: "add_workout_icon")!.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
        let userSelectedImage: UIImage = UIImage(named: "add_workout_icon")!.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
        
            tabBar.items![2].image = userUnselectedImage
            tabBar.items![2].selectedImage = userSelectedImage
        
        
    }
    
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        let tagValue = viewController.tabBarItem.tag
        if tagValue == 2 {
            return false
        }
        
        return true
    }
    
}

自定义标签栏类

import UIKit
@IBDesignable
class TabBarShape: UITabBar {
    private var shapeLayer: CALayer?
    private func addShape() {
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = createPath()
        shapeLayer.strokeColor = UIColor.lightGray.cgColor
        shapeLayer.fillColor = UIColor.white.cgColor
        shapeLayer.lineWidth = 1.0
        
        //The below 4 lines are for shadow above the bar. you can skip them if you do not want a shadow
        shapeLayer.shadowOffset = CGSize(width:0, height:0)
        shapeLayer.shadowRadius = 10
        shapeLayer.shadowColor = UIColor.gray.cgColor
        shapeLayer.shadowOpacity = 0.3

        if let oldShapeLayer = self.shapeLayer {
            self.layer.replaceSublayer(oldShapeLayer, with: shapeLayer)
        } else {
            self.layer.insertSublayer(shapeLayer, at: 0)
        }
        self.shapeLayer = shapeLayer
    }
    override func draw(_ rect: CGRect) {
        self.addShape()
    }
    func createPath() -> CGPath {
        let height: CGFloat = 35.0
        let path = UIBezierPath()
        let centerWidth = self.frame.width / 2
        path.move(to: CGPoint(x: 0, y: 0)) // start top left
        path.addLine(to: CGPoint(x: (centerWidth - height * 2) + 30, y: 0)) // the beginning of the trough
        //path.addLine(to: CGPoint(x: 150, y: 0)) // hardcoded
        print("x=>\((centerWidth - height * 2) + 37.5)")

        path.addCurve(to: CGPoint(x: centerWidth, y: height),
        controlPoint1: CGPoint(x: (centerWidth - 30), y: 0), controlPoint2: CGPoint(x: centerWidth - 35, y: height))

        path.addCurve(to: CGPoint(x: (centerWidth + height * 2) - 30 , y: 0),
        //path.addCurve(to: CGPoint(x: 230, y: 0),
        controlPoint1: CGPoint(x: centerWidth + 35, y: height), controlPoint2: CGPoint(x: (centerWidth + 30), y: 0))
        
        print("x2=>\((centerWidth + height * 2))")

        path.addLine(to: CGPoint(x: self.frame.width, y: 0))
        path.addLine(to: CGPoint(x: self.frame.width, y: self.frame.height))
        path.addLine(to: CGPoint(x: 0, y: self.frame.height))
        path.close()
        

        return path.cgPath
    }
    
}

界面图片

【问题讨论】:

  • 您是否为此使用了自定义库?
  • 是的............
  • 查看答案。
  • 检查已编辑的答案。

标签: ios swift uitabbarcontroller uitabbaritem


【解决方案1】:

删除这个(因为不需要它这样做。)func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 像下面那样做

override func viewDidLoad() {
    super.viewDidLoad()
    
    self.delegate = self
}

// UITabBarDelegate
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    print("Selected item")
    let items = self.tabBar.items
    for (i,it) in items!.enumerated() {
        if i == 2 && it == item{
            self.tabBar.tintColor = .gray
        }else {
            self.tabBar.tintColor = .red
        }
    }
}

确保您更改了 UITabBarController 类。

【讨论】:

  • 但我不想删除标题
  • @developerdeveloper 不是你想要的?
  • 我只是希望选择的颜色应该相同
  • 当我点击 + 按钮时,标签(锻炼)颜色不应该改变,它应该是灰色而不是蓝色
猜你喜欢
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2011-12-26
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多