gerade Xcode 9 heruntergeladen und ich habe dieses seltsame Problem. Auf iOS 11 scheint meine benutzerdefinierte Navigationsleiste halb so groß zu sein und befindet sich unter der Statusleiste. Auf iOS 10 funktioniert sie einwandfrei.
also hier ist mein Code
let newNavbar: UINavigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 64))
let navItem = UINavigationItem()
//create and assign the items
newNavbar.setItems([navItem], animated: false)
view.addSubview(newNavbar)
hier ist ein Screenshot, ios11 links und ios10 rechts.
Ihr Code war immer falsch. Sie sollten die Höhe einer manuell hinzugefügten Navigationsleiste nicht selbst festlegen oder oben in der Ansicht platzieren. Sie sollten den oberen Rand der Navigationsleiste an den unteren Rand der Statusleiste heften (z. B. den oberen Rand des sicheren Bereichs) und ihm einen Delegaten geben, damit Sie mit dem UIBarPositioningDelegate-Mechanismus seine Position auf .topAttached
Setzen können. Dadurch wird der Bildschirm korrekt nach oben gestreckt.
(Aber Sie sollten sich auch fragen: warum Sie fügen eine Navigationsleiste manuell hinzu. Es gibt normalerweise keinen Grund, Ihren View Controller nicht in einen UINavigationController einzubinden - auch wenn Sie nicht beabsichtigen, etwas Tatsächliches zu tun Navigation - nur um die Navigationsleiste mit all ihrer automatischen Verwaltung zu erhalten.)
Eine Antwort finden Sie unter ios 11 benutzerdefinierte Navigationsleiste befindet sich unter der Statusleiste / ios 11 Navigationsleiste überlappt die Statusleiste
Ich bin mir nicht sicher, ob dies dasselbe Problem ist, aber wir sind auch beim Upgrade auf iOS 11 darauf gestoßen.
Siehe iOS 11 benutzerdefinierte Navigationsleiste geht unter Statusleiste
Wir haben die Höhe der Navigationsleiste manuell auf 64 eingestellt und an den Rändern der Übersicht angeheftet. Die Anpassung an das UINavigationBarDelegate-Protokoll und die Implementierung der UIBarPositioningDelegate-Delegate-Methode lösten dies für uns.
Wir haben ersetzt
navigationBar.autoPinEdgesToSuperviewEdgesExcludingEdge(.bottom)
navigationBar.autoSetDimension(.height, toSize: 64)
mit
...
if #available(iOS 11.0, *) {
navigationBar.topAnchor.constraint(
equalTo: self.view.safeAreaLayoutGuide.topAnchor
).isActive = true
} else {
navigationBar.topAnchor.constraint(
equalTo: topLayoutGuide.bottomAnchor
).isActive = true
}
navigationBar.autoPinEdge(toSuperviewEdge: .left)
navigationBar.autoPinEdge(toSuperviewEdge: .right)
navigationBar.delegate = self
...
public func position(for bar: UIBarPositioning) -> UIBarPosition
return .topAttached
}
Dies verwendet das Purelayout-DSL für einige der Autolayout-Aufrufe ( https://github.com/PureLayout/PureLayout )
Das Guthaben geht an https://stackoverflow.com/users/341994/matt für eine Antwort
Versuchen Sie, einige Einschränkungen für das automatische Layout hinzuzufügen, nachdem Sie der Ansicht die Navigationsleiste hinzugefügt haben
if #available(iOS 11.0, *) {
newNavbar.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
newNavbar.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
newNavbar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
newNavbar.heightAnchor.constraint(equalToConstant: 64).isActive = true
}
Sie können in früheren Versionen von iOS tatsächlich alle Einschränkungen außer der dritten verwenden. Wenn dies jedoch in früheren Versionen funktioniert, möchten Sie möglicherweise nicht damit herumspielen.
Wenn Sie den sicheren Layoutbereich verwenden, sollte sich die Navigationsleiste unter der Statusleiste befinden.
Stellen Sie zunächst sicher, dass die Option "Navigationsleiste anzeigen" Ihres Navigationscontrollers im Storyboard deaktiviert ist.
Ziehen Sie dann die Navigationsleiste per Drag & Drop aus der "Objektbibliothek". Geben Sie Top Constraint gleich 20.
Es wird auch perfekt in "iPhone X Simulator" funktionieren.
Viel Spaß beim Codieren!
Versuchte diese Lösung in Swift 4.1
let menuBar: UIView = {
let mb = UIView()
mb.backgroundColor = .red
mb.translatesAutoresizingMaskIntoConstraints = false
return mb
}()
private func setupMenuBar(){
view.addSubview(menuBar)
let constraints = [ menuBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
menuBar.leadingAnchor.constraint(equalTo: view.leadingAnchor),
menuBar.trailingAnchor.constraint(equalTo: view.trailingAnchor),
menuBar.heightAnchor.constraint(equalToConstant: 50)]
NSLayoutConstraint.activate(constraints)
}