wake-up-neo.com

Die benutzerdefinierte Navigationsleiste von iOS 11 befindet sich in der Statusleiste

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.

enter image description here

13
iknowNothing

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

23
matt

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

5
Darren Cheng

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.

3
theMikeSwan

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!

1
MyApp

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)
}
1
MJ Montes