Swift 如何使用导航控制器隐藏选项卡栏项目上的标题

Swift 如何使用导航控制器隐藏选项卡栏项目上的标题,swift,uinavigationcontroller,uitabbarcontroller,uitabbaritem,Swift,Uinavigationcontroller,Uitabbarcontroller,Uitabbaritem,我在导航控制器上有一个与选项卡栏控制器连接的选项卡栏项目,我想删除swift中的标题 选项卡栏控制器>导航控制器>视图控制器 应用程序从带有五个选项卡的选项卡栏控制器开始,每个选项卡都可以正常工作,我的意思是将标题隐藏在选项卡栏项下,但图像中的选项卡仅存在未隐藏的问题,因此应用程序也可以使用此选项卡,如果用户注销,并且图像中的Viewcontroller正常正在显示,但如果用户正在登录,则选项卡栏上的标题项将显示,因此如果没有,我可以在Xcode上以编程方式隐藏标题,请转到情节提要,然后单击

我在导航控制器上有一个与选项卡栏控制器连接的选项卡栏项目,我想删除swift中的标题

选项卡栏控制器>导航控制器>视图控制器


应用程序从带有五个选项卡的选项卡栏控制器开始,每个选项卡都可以正常工作,我的意思是将标题隐藏在选项卡栏项下,但图像中的选项卡仅存在未隐藏的问题,因此应用程序也可以使用此选项卡,如果用户注销,并且图像中的Viewcontroller正常正在显示,但如果用户正在登录,则选项卡栏上的标题项将显示,因此如果没有,我可以在
Xcode
上以编程方式隐藏标题,请转到情节提要,然后单击设置图标的导航控制器。单击导航控制器底部的
选项卡项
。在左侧,转到属性检查器并删除barItem标题

您也可以通过编程的方式来实现这一点,即使您的故事板将保持不同

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

可以使用
uitabaritem
上的标题配置选项卡,该标题由选项卡中根视图控制器的标题覆盖。因此,我想象您正在BookingViewController中设置
title=“Booking”

据我所知,没有API可以显式隐藏选项卡标题,但基本上可以通过将它们移出屏幕来隐藏它们:

let tabBarTitleOffset = UIOffsetMake(0,50)
for controller in tabBarController.viewControllers? {
    controller.tabBarItem.titlePositionAdjustment = tabBarTitleOffset
}
然后,图标可能会显示得有点高,您也可以通过设置
tabBarItem.imageInsets
进行调整以进行补偿。您可以尝试此操作

将此添加到不需要标题的视图控制器中

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

我将创建一个子类
uitabaritem
,该子类限制设置
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)

我最近遇到了这个问题,我想我应该为子孙后代发布我自己的解决方案,因为我认为它很轻,有些人可能更喜欢它

首先,不管您如何创建选项卡项(我的是一个
uitabarcontroller
子类,我将我的子控制器传递到该子类中)-将选项卡项标题设置为空字符串

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

您可能知道,设置UIViewController的标题将导致相关选项卡项拾取标题

要在不设置选项卡项标题的情况下拥有UIViewController标题,请将新UILabel添加到视图控制器的导航项标题视图

我在
UIViewController
上创建了一个扩展,如下所示:

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
    }
}
自定义您喜欢的字体和颜色。让标签自行调整大小,这样您就不必在此处测量或设置其框架

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

现在,在任何选项卡子控制器中,为了在不拾取选项卡项标题的情况下设置视图控制器标题,我只需调用
addNavItemTitle(resourceString:“example.title”)

viewDidLoad

您可能还注意到,我对
NSLocalizedString
的调用缺少一个参数。这是因为我倾向于对注释使用与资源字符串相同的字符串。因此,我创建了一个全局函数来简化调用,而无需重复字符串

像这样:

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

正如其他人所建议的,您可以转到Interface Builder并删除条形图项目上的标题,也可以通过编程来完成


只要不为选项卡链接到的UIViewController设置title属性,这就足够了。如果要为视图控制器设置标题并避免其显示为条形项目标题,请使用
navigationItem.title=“My title”
而不是
title=“My title”

谢谢,伙计,但我已经这么做了,如何从UITabBarController隐藏标题是行不通的?好吧,xcode技巧应该可以很好地工作。它只是设置项目下方显示的文本。如果要隐藏并再次显示,则必须使用编程代码。我假定您已询问我在何处添加代码。好的,在任何链接到选项卡栏的视图中,但是你应该添加到第一个显示的视图中。我刚刚更新了主题,希望现在更清楚谢谢你,伙计,我知道了,感谢你关于覆盖的想法,我刚刚发现我的viewcontroller在导航控制器中有一个标题,它影响了我在选项卡栏项目上的标题。有史以来最好的解决方案!!