如何让iOS navigationItem.titleView对齐左边?

时间:2016-02-20 22:34:34

标签: ios swift

navigationItem.hidesBackButton  = true
navigationItem.leftBarButtonItem = nil

head = UIView()
head.frame = CGRectMake(0, 0, 200, 44)
head.frame.origin.x = CGFloat(0)
navigationItem.titleView = head

我尝试将titleView对齐到左边,但它仍然保留在中间。

8 个答案:

答案 0 :(得分:5)

尝试一下:

let title = UILabel()
title.text = "TITLE"

let spacer = UIView()
let constraint = spacer.widthAnchor.constraint(greaterThanOrEqualToConstant: CGFloat.greatestFiniteMagnitude)
constraint.isActive = true
constraint.priority = .defaultLow

let stack = UIStackView(arrangedSubviews: [title, spacer])
stack.axis = .horizontal

navigationItem.titleView = stack

这个想法是主视图(在这种情况下为title)将占据其所需的所有空间,而spacer视图将占据剩余的所有可用空间。

enter image description here

答案 1 :(得分:1)

我不认为Apple希望你这样做。导航栏有一个非常特定的目的,通常涉及在左上角有一些其他东西,如后退按钮。你可能最好制作一个看起来像导航栏的自定义UIView或UIToolbar。

答案 2 :(得分:1)

您无法将标题视图对齐到左侧。您可以创建标题视图并添加位于其左侧的子视图。如果您希望显示代替后退按钮,那么您应该使用条形按钮项而不是标题视图。

答案 3 :(得分:1)

我有类似的要求,即在导航栏的左侧添加标题和副标题。我无法通过TitleView实现此功能,因为它无法向左对齐。 因此,我采用了@TIMEZ和@Wain的答案以及来自线程here的响应,并添加了完整的答案,以防它对任何人有帮助:

let titleLabel = UILabel()
    titleLabel.text = "Pillars"
    titleLabel.textAlignment = .center
    titleLabel.font = .preferredFont(forTextStyle: UIFont.TextStyle.headline)

    let subtitleLabel = UILabel()
    subtitleLabel.text = "How did you do today?"
    subtitleLabel.textAlignment = .center
    subtitleLabel.font = .preferredFont(forTextStyle: UIFont.TextStyle.subheadline)

    let stackView = UIStackView(arrangedSubviews: [titleLabel, subtitleLabel])
    stackView.distribution = .equalSpacing
    stackView.alignment = .leading
    stackView.axis = .vertical

    let customTitles = UIBarButtonItem.init(customView: stackView)
    self.navigationItem.leftBarButtonItems = [customTitles]

答案 4 :(得分:0)

我明白了。

我只需要将自定义UIView设置为leftBarButtonItem。

答案 5 :(得分:0)

您可以将titleView约束到navigationBars leftAnchor。

 private func setupNavigationBarTitleView() {
        let titleView = YourCustomTitleView()
        navigationBarTitleView = titleView
        navigationBarTitleView?.translatesAutoresizingMaskIntoConstraints = false
        navigationItem.titleView = navigationBarTitleView

        if let navigationBar = navigationController?.navigationBar {
            NSLayoutConstraint.activate([
                titleView.leadingAnchor.constraint(equalTo: navigationBar.leadingAnchor, constant: 16),
                titleView.heightAnchor.constraint(equalToConstant: 36)
            ])
        }

    }

答案 6 :(得分:0)

如果它是自定义的UIView,请覆盖internalContentSize并返回

CGSize(width: .greatestFiniteMagnitude, height: UIView.noIntrinsicMetric)

这会将视图拉伸到左右条形按钮项目之间的整个宽度。

答案 7 :(得分:0)

最简单的解决方案是为标题宽度添加低优先级约束。

    let titleLabel = UILabel()
    titleLabel.textAlignment = .left

    ...

    let c = titleLabe.widthAnchor.constraint(equalToConstant: 10000)
    c.priority = .required - 1
    c.isActive = true

    navigationItem.titleView = titleLabel