Как установить ширину NavigationTitleView и Truncate метки по swift3

У меня проблема с навигацией titleView.
TitleView покрывает мой правый barbuttonItem и вне экрана.
Мне нужно titleView только в центральной области и иметь правильный регион для barbuttonItem.
Я хочу знать, как установить ширину для моего заголовка, потому что я не могу установить ширину успешно.
И я также хочу усечь средний лейбл.
Что со мной не так?
Благодарю.

Вот изображение о моем вопросе.
Вот изображение о моем вопросе.

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
}

1 ответ

Решение

Вы должны заранее рассчитать размер / кадр вида заголовка. Один из возможных способов сделать это - учитывать ширину экрана и количество элементов панели кнопок, представленных на панели навигации.

Посмотрите на следующий код (упрощенно для показа только заголовка, без субтитров):

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)
}

И вывод:

Другие вопросы по тегам