首页 文章

如何使用导航控制器隐藏标签栏项目上的 Headers

提问于
浏览
5

导航控制器上的标签栏项目与标签栏控制器连接,我想删除swift中的 Headers

标签栏控制器>导航控制器>视图控制器

Tab Bar Item

Flow of the program

应用程序从带有五个选项卡的标签栏控制器开始,每个选项卡中的一个正常工作我的意思是隐藏标签栏项下的 Headers ,但图像中的选项卡只有未隐藏的问题,并且应用程序是如果用户已注销并且图像中的Viewcontroller正在显示但是如果用户登录标签栏上的 Headers 项目正在显示,那么如果没有我可以以编程方式隐藏 Headers ,也可以在此选项卡上工作

6 回答

  • 5

    正如其他人所建议的那样,您可以转到Interface Builder并删除Bar Item上的Title,也可以以编程方式执行 .

    只要您没有为选项卡链接到的UIViewController设置title属性,这就足够了 . 如果要为视图控制器设置 Headers 并避免显示为条形项 Headers ,请使用 navigationItem.title = "My Title" 而不是 title = "My Title" .

  • 4

    Xcode 上转到故事板,然后单击设置图标的导航控制器 . 单击navigationController底部的 tabBarItem . 在左侧转到属性检查器并删除barItem Headers .

    您也可以以编程方式执行此操作,即使您的故事板仍然不同 .

    let items = self.tabBarController?.tabBar.items
    let tabItem = items![2]
    tabItem.title = ""
    
  • 2

    标签可以在 UITabBarItem 上配置 Headers ,该 Headers 由选项卡中根视图控制器的 Headers 覆盖 . 所以我想你在BookingViewController中设置 title = "Booking" .

    我没有明确隐藏标签 Headers 的API,但你可以通过基本上将它们移出屏幕来隐藏它们:

    let tabBarTitleOffset = UIOffsetMake(0,50)
    for controller in tabBarController.viewControllers? {
        controller.tabBarItem.titlePositionAdjustment = tabBarTitleOffset
    }
    

    然后您的图标可能会显得有点高,您也可以通过设置 tabBarItem.imageInsets 进行调整以进行补偿 .

  • 1

    我创建一个 UITabBarItem 的子类,限制设置 title ,如下所示:

    final class MyTabBarItem: UITabBarItem {
    
        override var title: String? {
            get { return nil }
            set { super.title = title }
        }
    
        override var imageInsets: UIEdgeInsets {
            get { return UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0) }
            set { super.imageInsets = imageInsets }
        }
    
        convenience init(image: UIImage? , selectedImage: UIImage?) {
            self.init()
    
            self.image = image
            self.selectedImage = image
        }
    
        override init() {
            super.init()
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    

    然后使用您的自定义类初始化视图控制器的 tabBarItem

    tabBarItem = MyTabBarItem(image: UIImage(named: "my_img"), selectedImage: nil)
    
  • 0

    你可以试试这个 .

    在您不想要 Headers 的视图控制器中添加此项

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.title = ""
      }
    
  • 0

    我最近遇到了这个问题,并认为我会发布我自己的解决方案,为后代,因为我认为它非常轻,有些人可能更喜欢它 .

    首先,你创建你的标签项(我的是我将子控制器传递给的 UITabBarController 子类) - 将标签项 Headers 设置为空字符串 .

    (当然,此解决方案也特定于OP场景,其中您有一个带有嵌入式Nav控制器的 TabbarController - 这是相对常见的) .

    您可能知道,设置UIViewController的 Headers 将导致相关标签项获取 Headers .

    为了拥有UIViewController Headers 而不设置Tab项 Headers - 将新的UILabel添加到视图控制器的导航项 Title View .

    我最终在_962085上创建了一个扩展名,如下所示:

    extension UIViewController {
    
        func addNavItemTitle(resourceString: String, textColor: UIColor = UIColor.white) {
            // Add title view ~ allows overriding title w/out showing it on tabBarItem
            let titleLabel = UILabel()
            titleLabel.text = NSLocalizedString(resourceString)
            titleLabel.textColor = textColor
            titleLabel.font = UIFont.viewTitle
            titleLabel.sizeToFit()
    
            self.navigationItem.titleView = titleLabel
        }
    }
    

    根据需要自定义字体和颜色 . 让标签大小本身,这样你就不必测量它或在这里设置它的框架 .

    我也更喜欢使用本地化字符串而不是直接设置字符串 .

    现在,在任何标签子控制器中,为了设置我的视图控制器 Headers 而不拿起标签项目 Headers - 我只需要调用 addNavItemTitle(resourceString: "example.title")

    一个好地方是 viewDidLoad

    您可能还注意到我对 NSLocalizedString 的调用缺少一个参数 . 's because I tend to use the same string for the comment as the resource string. So I' ve创建了一个全局函数来简化调用而不重复字符串 .

    像这样:

    public func NSLocalizedString(_ key: String) -> String {
        return NSLocalizedString(key, comment: key)
    }
    

相关问题