Как настроить пользовательский вид на панели навигации и контролировать максимальную ширину? - PullRequest
0 голосов
/ 11 февраля 2019

Я наконец-то поставил на панель навигации свой собственный вид в точности так, как я хотел, состоящий из изображения и имени пользователя, например, Whatsapp, конечно, этот вид имеет автоматическое расположение, поэтому не имеет значения ширина текста, которая будет адаптироваться, но если текст длиннее, вот что происходит:

Custom View with long name

Это код из моего пользовательского просмотра, который я хочу установить как leftBarButtonItem.

class NavView: UIView {

@IBOutlet private weak var principalView: UIView!
@IBOutlet private weak var principalImage: UIImageView!
@IBOutlet private weak var nameLabel: UILabel!

class func instanceFromNib() -> UIView {
    return UINib(nibName: "NavView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
}

override init(frame: CGRect) {
    super.init(frame: frame)
    self.setup()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.setup()
}

func setup() {

    self.principalView                  = loadViewFromNib()
    self.principalView.autoresizingMask = [UIView.AutoresizingMask.flexibleWidth,
                             UIView.AutoresizingMask.flexibleHeight]
    self.principalView.translatesAutoresizingMaskIntoConstraints = true

    addSubview(principalView)
}

func loadViewFromNib() -> UIView! {
    let bundle = Bundle(for: type(of: self))
    let nib    = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
    let view   = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

    return view
}

public func setImage(withName name: String) {
    self.principalImage.image = UIImage(named: name)
    self.principalImage.layer.borderColor  = UIColor.black.cgColor
    self.principalImage.layer.borderWidth  = 1
    self.principalImage.layer.cornerRadius = self.principalImage.frame.width / 2
    self.principalImage.clipsToBounds      = true
}

public func setUser(name: String) {
    self.nameLabel.text = name
}
}

Чтобы поместить его на панель навигации, я просто установил этот код на моем ViewController (ширина не имеет значения, потому что он будет обновляться в зависимости от текста).

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNavBar()
}

func setNavBar() {
    let backButton   = UIBarButtonItem(image: #imageLiteral(resourceName: "ico_arrow_left.png"), style: .plain, target: self, action: #selector(goBack(_:)))
    let customNavBar = NavView(frame: CGRect(x: 0, y: 0, width: 44.0, height: 44.0))

    customNavBar.setImage(withName: "picture2")
    customNavBar.setUser(name: "My really long long long long name")

    navigationItem.leftBarButtonItems = [backButton,UIBarButtonItem.init(customView: customNavBar)]
}

Мне нужно установить максимальную ширину, чтобы избежать этой ошибки, когда текст слишком велик, это должно произойти:

enter image description here

Но не происходит.

...