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

时间:2015-07-10 22:30:39

标签: ios swift uinavigationcontroller uilabel uinavigationitem

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

正如我所见,我需要使用navigationItem,但我不知道究竟是怎么做到的。如果有人有任何例子,或者如果有人能够更具体地向我解释如何这样做会很棒。

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

2 个答案:

答案 0 :(得分:25)

我不确定你是否可以从故事板中做到这一点,但是如果你想添加两个标题标签,你可以在视图控制器的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)
}

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

答案 1 :(得分: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
        }
    }
}

Demonstrates using a stack view to create a custom navigation item's title view