通过在 Swift 中添加两个标签而不是标题来自定义导航栏
Customize navigation bar by adding two labels instead of title in Swift
我想在导航栏中显示标题的地方添加两个标签,但我很难这样做。如果我能用故事板实现这一点,那就太好了,但正如我所见,我做不到。
如我所见,我需要使用 navigationItem,但我不知道该怎么做。如果有人有任何例子,或者如果有人可以更具体地向我解释如何这样做,那就太好了。
而且我需要说明的是,我完全不熟悉 Obj-C,因此任何帮助都需要在 Swift 中提供。
我不确定你是否可以从情节提要中做到这一点,但如果你想添加两个标题标签,你可以在你想要的视图控制器的 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)
}
通过这种方式,您可以在导航栏中添加任意数量的子视图
下面是一个使用堆栈视图的实现,它还为您提供了一些标签布局的多功能性:
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
}
}
}
我想在导航栏中显示标题的地方添加两个标签,但我很难这样做。如果我能用故事板实现这一点,那就太好了,但正如我所见,我做不到。
如我所见,我需要使用 navigationItem,但我不知道该怎么做。如果有人有任何例子,或者如果有人可以更具体地向我解释如何这样做,那就太好了。
而且我需要说明的是,我完全不熟悉 Obj-C,因此任何帮助都需要在 Swift 中提供。
我不确定你是否可以从情节提要中做到这一点,但如果你想添加两个标题标签,你可以在你想要的视图控制器的 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)
}
通过这种方式,您可以在导航栏中添加任意数量的子视图
下面是一个使用堆栈视图的实现,它还为您提供了一些标签布局的多功能性:
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
}
}
}