通过在 Swift 中添加两个标签而不是标题来自定义导航栏

Posted

技术标签:

【中文标题】通过在 Swift 中添加两个标签而不是标题来自定义导航栏【英文标题】:Customize navigation bar by adding two labels instead of title in Swift 【发布时间】:2015-07-10 22:30:38 【问题描述】:

我正在尝试在导航栏中显示标题的位置添加两个标签,但我正在努力这样做。如果我能用故事板实现这一点,那就太好了,但我可以看到我做不到。

正如我所见,我需要使用 navigationItem 但我不知道该怎么做。如果有人有任何例子,或者如果有人可以更具体地向我解释如何做到这一点,那就太好了。

我需要提一下,我对 Obj-C 完全不熟悉,所以任何帮助都需要在 Swift 中。

【问题讨论】:

【参考方案1】:

我不确定你是否可以从情节提要中做到这一点,但如果你想添加两个标题标签,你可以在你想要两个标题的视图控制器的 viewDidLoad() 方法中执行以下操作:

if let navigationBar = self.navigationController?.navigationBar 
    let firstFrame = CGRect(x: 0, y: 0, width: navigationBar.frame.width/2, height: navigationBar.frame.height)
    let secondFrame = CGRect(x: navigationBar.frame.width/2, y: 0, width: navigationBar.frame.width/2, height: navigationBar.frame.height)

    let firstLabel = UILabel(frame: firstFrame)
    firstLabel.text = "First"

    let secondLabel = UILabel(frame: secondFrame)
    secondLabel.text = "Second"

    navigationBar.addSubview(firstLabel)
    navigationBar.addSubview(secondLabel)

通过这种方式,您可以向导航栏添加任意数量的子视图

【讨论】:

如果你能帮我解决一个额外的问题。如何为这些标签添加约束,使它们水平居中放置,一个位于另一个下方 @vdawg 标签正在背靠背对齐...请告诉我们如何将标签相互对齐 @Bevan 你可以改变 firstFrame' 和 secondFrame 属性来调整标签的框架 let firstFrame = CGRect(x: 0, y: 0, width: navigationBar.frame.width, height: navigationBar.frame.height/2) let secondFrame = CGRect(x: 0, y: navigationBar.frame.height/2, width: navigationBar.frame.width, height: navigationBar.frame.height/2) 在我的例子中,中心对齐也成功了:firstLabel.textAlignment = .Center【参考方案2】:

这是一个使用堆栈视图的实现,它还为您提供了标签布局的一些多功能性:

class ViewController: UIViewController 

    lazy var titleStackView: UIStackView = 
        let titleLabel = UILabel()
        titleLabel.textAlignment = .center
        titleLabel.text = "Title"
        let subtitleLabel = UILabel()
        subtitleLabel.textAlignment = .center
        subtitleLabel.text = "Subtitle"
        let stackView = UIStackView(arrangedSubviews: [titleLabel, subtitleLabel])
        stackView.axis = .vertical
        return stackView
    ()

    override func viewDidLoad() 
        super.viewDidLoad()
        navigationItem.titleView = titleStackView
    

    override func viewWillLayoutSubviews() 
        super.viewWillLayoutSubviews()

        if view.traitCollection.horizontalSizeClass == .compact 
            titleStackView.axis = .vertical
            titleStackView.spacing = UIStackView.spacingUseDefault
         else 
            titleStackView.axis = .horizontal
            titleStackView.spacing = 20.0
        
    

【讨论】:

以上是关于通过在 Swift 中添加两个标签而不是标题来自定义导航栏的主要内容,如果未能解决你的问题,请参考以下文章

我获取的数据只显示一个数据而不是显示两个(Firebase,Swift)

如何使用 Xcode 10 而不是 swift 添加 CoreLocation 框架?

如果 Swift 通过值而不是引用传递,为啥我可以通过将 UIView 传递给函数来在 Swift 中操作 UIView 的属性? [复制]

我可以在 A 标签上添加一个属性来获取在新选项卡而不是同一窗口中打开的链接吗?

通过 URL 而不是 HTML 提交 Paypal 打开新标签

向 mp3 AVAudioPlayer 添加进度条播放 swift