如何通过swift 3设置导航TitleView和Truncate标签的宽度

how to set width of navigationTitleView and Truncate label by swift3

我对导航 titleView 有疑问。
titleView 覆盖了我右边的 barbuttonItem 并超出了屏幕。
我只需要在中心区域使用 titleView,并为 barbuttonItem 设置合适的区域。
我想知道如何设置标题的宽度,因为我无法成功设置宽度。
而且我还想截断标签的中间部分。
我怎么了?
谢谢

Here is Image about my question.
Here is Image about my question.

self.navigationItem.titleView = setTitle(title: name, subtitle: "")


func setTitle(title:String, subtitle:String) -> UIView {
    let titleLabel = UILabel(frame: CGRect(x:0, y:5, width:0, height:0))

    titleLabel.backgroundColor = UIColor.clear
    titleLabel.textColor = UIColor.white
    titleLabel.font = defaultTitleFont
    titleLabel.text = title
    titleLabel.sizeToFit()

    let subtitleLabel = UILabel(frame: CGRect(x:5, y:18, width:0, height:0))
    subtitleLabel.backgroundColor = UIColor.clear
    subtitleLabel.textColor = UIColor.red
    subtitleLabel.font = UIFont.systemFont(ofSize: 20)
    subtitleLabel.text = subtitle
    subtitleLabel.sizeToFit()

    let titleView = UIView(frame: CGRect(x:0, y:0, width:max(titleLabel.frame.size.width, subtitleLabel.frame.size.width), height:35))
    titleView.addSubview(titleLabel)
    //titleView.addSubview(subtitleLabel)

    let widthDiff = subtitleLabel.frame.size.width - titleLabel.frame.size.width

    if widthDiff > 0 {
        var frame = titleLabel.frame
        frame.origin.x = widthDiff / 2
        titleLabel.frame = frame.integral
    } else {
        var frame = subtitleLabel.frame
        frame.origin.x = abs(widthDiff) / 2
        subtitleLabel.frame = frame.integral
    }

    return titleView
}

您必须事先计算标题视图 size/frame。 一种可能的方法是考虑屏幕宽度和导航栏中显示的栏按钮项目的数量。

看看下面的代码(只显示标题,没有副标题的简化):

func getTitleView (title:String, numOfButtons: Int = 0) -> UIView {
    let barButtonSize = 70
    let offset: CGFloat = CGFloat(numOfButtons * barButtonSize)
    let frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width - offset, height: 35)
    let titleView = UIView(frame:frame)

    let titleLabel = UILabel(frame: titleView.bounds)

    titleLabel.backgroundColor = UIColor.clear
    titleLabel.textColor = UIColor.red
    titleLabel.font = UIFont.systemFont(ofSize: 14)
    titleLabel.text = title
    titleLabel.numberOfLines = 1
    titleLabel.textAlignment = .center
    titleLabel.lineBreakMode = .byTruncatingMiddle
    titleView.addSubview(titleLabel)
    return titleView
}

并且来自 viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: nil)
    self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: self, action: nil)

    self.navigationItem.titleView = getTitleView(title: "Wow Wow Wow Wow Wow Wow Wow Wow Wow Wow Wow Wow Wow Wow Wow WowWow Wow Wow Wow Wow Wow Wow WowWow WowWowWowWowWowWowWowWow Wow Wow Wow Wow Wow Wow Wow!!", numOfButtons: 2)
}

并输出: