web-dev-qa-db-fra.com

Comment ajouter par programme une vue directement sous la barre de navigation?

J'essaie d'ajouter une vue à une variable UINavigationController dont le haut est aligné sur le bas de la barre de navigation.

J'ai essayé d'utiliser des contraintes en ajoutant les éléments suivants à ma sous-classe UINavigationController:

override func viewDidAppear(_ animated: Bool) {
           self.label = UILabel()
    self.label?.translatesAutoresizingMaskIntoConstraints = false
    self.label?.backgroundColor = UIColor.red
    self.label?.text = "label text"
    self.view.addSubview(self.label!)
    let horConstraint = NSLayoutConstraint(item: label!, attribute: .top, relatedBy: .equal,
                                           toItem: topLayoutGuide, attribute: .bottom,
                                           multiplier: 1.0, constant: 0.0)
    let widthConstr = NSLayoutConstraint(item: label!, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100)

    let heightConstr = NSLayoutConstraint(item: label!, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100)
    view.addConstraints([horConstraint, widthConstr, heightConstr])
}

Ceci étant le résultat:

 enter image description here

Et j'ai essayé en définissant le cadre de ma sous-vue:

override func viewDidAppear(_ animated: Bool) {

    self.label = UILabel(frame: CGRect(x: 0, y: navigationBar.frame.height, width: 300, height: 100))
    self.label?.translatesAutoresizingMaskIntoConstraints = false
    self.label?.backgroundColor = UIColor.red
    self.label?.text = "label text"
    self.view.addSubview(self.label!)

}

Et ceci est sorti:

 enter image description here

Dans les deux cas, mon étiquette couvre une partie de la barre de navigation. Comment résoudre ce problème?

4
Spaci Tron

La hauteur de la barre d'état est de 20.Vous devez également tenir compte de la barre d'état lors de l'attribution de y de votre étiquette. Votre viewDidAppear devrait être 

override func viewDidAppear(_ animated: Bool) {

    self.label = UILabel(frame: CGRect(x: 0, y: navigationBar.frame.height+20, width: navigationBar.frame.width, height: 100))
    self.label?.translatesAutoresizingMaskIntoConstraints = false
    self.label?.backgroundColor = UIColor.red
    self.label?.text = "label text"
    self.view.addSubview(self.label!)
 }

J'espère que ça aide. Bonne codage !!

2
luckyShubhra

Swift 4.

 enter image description here

Essayez ce code avec NSLayoutConstraint. newView apparaîtra juste sous NavigationBar 

        self.edgesForExtendedLayout = []//Optional our as per your view ladder

        let newView = UIView()
        newView.backgroundColor = .red
        self.view.addSubview(newView)
        newView.translatesAutoresizingMaskIntoConstraints = false
        if #available(iOS 11.0, *) {
            let guide = self.view.safeAreaLayoutGuide
            newView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
            newView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
            newView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
            newView.heightAnchor.constraint(equalToConstant: 50).isActive = true
        } else {
            NSLayoutConstraint(item: newView,
                               attribute: .top,
                               relatedBy: .equal,
                               toItem: view, attribute: .top,
                               multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: newView,
                               attribute: .leading,
                               relatedBy: .equal, toItem: view,
                               attribute: .leading,
                               multiplier: 1.0,
                               constant: 0).isActive = true
            NSLayoutConstraint(item: newView, attribute: .trailing,
                               relatedBy: .equal,
                               toItem: view,
                               attribute: .trailing,
                               multiplier: 1.0,
                               constant: 0).isActive = true

                newView.heightAnchor.constraint(equalToConstant: 50).isActive = true
        }
7
Jack

Le cadre de la barre de navigation est (0 20; 375 44), vous pouvez définir la position de l'étiquette y sur 64.

2
user7724945

Vous ne calculez pas la hauteur de la barre d'état avec la barre de navigation. Au total, ils sont 64, 44 barre de navigation et 20 pour la barre d'état

1
RJiryes

Remplacez ceci 

self.label = UILabel(frame: CGRect(x: 0, y: navigationBar.frame.height, width: 300, height: 100))

avec 

self.label = UILabel(frame: CGRect(x: 0, y: 64, width: 300, height: 100))

la barre de navigation et la barre d'état ont ensemble une hauteur de 64. Définissez-la comme position y

1
Bali
override func viewDidAppear(_ animated: Bool) {
let label = UILabel(frame: CGRect(x: 0, y: (navigationController?.navigationBar.frame.height)! + 20, width: UIScreen.main.bounds.width, height: 40))
label.translatesAutoresizingMaskIntoConstraints = true
label.text = "Hello"
label.backgroundColor = UIColor.red
self.view.addSubview(label)

}

 enter image description here

0
karthik