2017-05-23 3 views
1

Ich benutze Eureka forms. Eine meiner benutzerdefinierten Selektorzeilen präsentiert modal eine andere VC (EditorVC) im Stil von formSheet.Wie kann ich programmgesteuert eine Navigationsleiste hinzufügen, die tatsächlich auf den Bildschirm passt?

Ich kann dies tun, indem Sie eine UINavigationController präsentieren und EditorVC als Root-VC haben. Dies würde jedoch erfordern, dass ich Daten (nämlich den Wert der Zeile, wenn sich etwas in EditorVC ändert) zwischen UINavigationController und EditorVC weiterleiten muss. Das ist zu beschwerlich für mich.

Aus diesem Grund habe ich programmgesteuert eine Navigationsleiste erstellt.

Ich suchte auf SO und dies ist mein erster Versuch:

myNav = UINavigationBar(frame: CGRect(x: 0, y: 0, width: self.view.width, height: 44)) 
myNav.barTintColor = #colorLiteral(red: 0.3529411765, green: 0.7333333333, blue: 0.3529411765, alpha: 1) 
myNav.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] 
self.view.addSubview(myNav) 
let cancelItem: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancel)) 
cancelItem.tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) 
let doneItem: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 
doneItem.tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) 
let navigItem: UINavigationItem = UINavigationItem(title: "Title") 
navigItem.rightBarButtonItem = doneItem 
navigItem.leftBarButtonItem = cancelItem 
myNav.items = [navigItem] 

Wenn ich die App auf einem iPhone laufen, die Navigationsleiste zeigt, wie erwartet, aber wenn ich die Bildschirmausrichtung zu ändern, die Navigationsleiste behält seine Breite bei und deckt somit nicht die gesamte Breite des Bildschirms ab. Auf einem iPad ist die Navigationsleiste zu breit. Es überschreitet die Breite des Formulars, so dass das Element der rechten Leiste nicht sichtbar ist. Der Titel ist auch nicht zentriert. So

Ich habe versucht, Layoutbeschränkungen auf die Navigationsleiste hinzuzufügen:

let top = NSLayoutConstraint(item: myNav, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 0) 
let leading = NSLayoutConstraint(item: myNav, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 0) 
let trailing = NSLayoutConstraint(item: myNav, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: 0) 
view.addConstraints([top, leading, trailing]) 

Aber anscheinend hat es nichts zu ändern. Wenn ich die App starte, passiert genau das Gleiche.

Wie kann ich eine Navigationsleiste erstellen, die immer die Bildschirmbreite anpassen kann? Das muss möglich sein, oder? Denn die UINavigationController hat es irgendwie geschafft.

+0

die Breite einmal sehen wird in Mainthread aktualisiert oder nicht –

Antwort

1

Sie müssen nur translateAutoresizingMaskIntoConstraints auf false setzen und alles wird in Ordnung sein. Sie benötigen dies, weil Sie Ihrer Sicht selbst Einschränkungen hinzufügen. Wenn Sie das nicht tun, müssen Sie selbst mit der Breite der Navigationsleiste umgehen, wenn das Telefon die Ausrichtung ändert (viewWillTransition() ...).

Auch wenn dies auf wahr gesetzt ist und Sie Ihre eigenen Einschränkungen hinzufügen, werden Sie wahrscheinlich einige Konflikte bekommen.

Also, dies zu tun:

let myNav = UINavigationBar(frame: CGRect.zero) 
myNav.translatesAutoresizingMaskIntoConstraints = false 

auch brauchen Sie nicht Breite navbar einstellen, weil Sie Einschränkungen verwenden. Sie setzen nur CGRect.zero es

Sie mehr über translatesAutoresizingMaskIntoConstraints lesen here

Verwandte Themen