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

k4ymrczo  于 2022-12-03  发布在  Swift
关注(0)|答案(7)|浏览(253)

我在导航控制器上有一个与选项卡栏控制器连接的选项卡栏项目,我想删除swift中的标题
选项卡栏控制器〉导航控制器〉视图控制器
Tab Bar Item
Flow of the program
应用程序从带有五个选项卡的选项卡栏控制器开始,其中每个选项卡都工作正常,我的意思是隐藏选项卡栏项目下的标题,但图像中的选项卡只有未隐藏的问题,因此,如果用户注销且图像中的Viewcontroller显示,但如果用户登录选项卡栏项目上的标题,应用程序也在此选项卡上工作。正在显示,所以如果有办法,我可以通过编程隐藏标题

7qhs6swi

7qhs6swi1#

正如其他人所建议的,你可以转到界面构建器并擦除栏项上的标题,或者你可以通过编程来完成。
只要您不设置选项卡链接到的UIViewController的title属性,这就足够了。如果您想为视图控制器设置标题,并避免它显示为栏项标题,请使用navigationItem.title = "My Title"而不是title = "My Title"

mccptt67

mccptt672#

Xcode上,转到你的故事板,然后点击导航控制器,在导航控制器底部点击tabBarItem。在左边,转到属性检查器,删除barItem标题。
您也可以通过编程方式执行此操作,即使您的情节提要将保持不同。

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

vbopmzt13#

标签页可以在UITabBarItem上配置一个标题,它被标签页中根视图控制器的标题覆盖。所以我想你是在BookingViewController中设置title = "Booking"
据我所知,没有API可以显式隐藏选项卡标题,但您可以通过将它们移出屏幕来隐藏它们:

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

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

1qczuiv0

1qczuiv04#

我会创建一个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)
uubf1zoe

uubf1zoe5#

你可以试试这个。
在视图控制器中添加此标题

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

2cmtqfgy6#

我最近遇到了这个问题,并认为我会张贴我自己的解决方案,为子孙后代,因为我认为它相当轻的重量,有些人可能会喜欢它。
首先,无论如何创建选项卡项(我的是一个UITabBarController子类,我将子控制器传递到其中)-将选项卡项标题设置为空字符串。
(Of当然,这种解决方案也是特定于OP场景的,在OP场景中,您有一个带有嵌入式导航控制器的TabbarController-这是相对常见的)。
正如您可能知道的,设置UIViewController的标题将导致相关选项卡项选择标题。
为了在不设置选项卡项标题的情况下获得UIViewController标题--将新的UILabel添加到视图控制器的导航项Title View
我最终在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)
}
42fyovps

42fyovps7#

将所选项目的标题颜色更改为选项卡栏背景颜色

viewController.tabBarItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : UIColor.white], for: .selected)

相关问题