it-swarm.com.de

die Statusleiste von iOS 7 kollidiert mit der Navigationsleiste

In meiner App gibt es einen Ansichtscontroller, auf dem eine Navigationsleiste im Storyboard gezogen wird. Es hat gut funktioniert unter iOS 6, aber in iOS 7 sieht es so aus:

ios 7 status bar nav var

Die Statusleiste und die Navigationsleiste sollten nicht miteinander kollidieren. Ich habe viele solcher Fragen zum Stack-Überlauf gesehen, aber sie haben mir nicht viel geholfen.

Einige Fragen besagen, dass ich "self.edgesForExtendedLayout = UIRectEdgeNone;" verwenden sollte. aber es hat nicht funktioniert. Einige sagen, ich sollte die Navigationsleiste entfernen und in den Navigationscontroller einbetten, was ich aufgrund der Art und Weise, wie mein Programm implementiert wird, nicht ausführen kann. Einige Lösungen schlagen vor, die Sichtgrenzen zu verwenden und alle, aber es funktionierte auch nicht für mich.

Was kann mir helfen, dieses Problem zu lösen? Danke im Voraus!

UPDATE: Ich habe den View-Controller in einen Uinavigation-Controller eingebettet. Die zuvor manuell hinzugefügte Navigationsleiste wurde entfernt. Jetzt sieht es im Storyboard gut aus, aber wenn ich es ausführe, zeigt es Folgendes:

iOS 7 Navigation Status bar

Es zeigt Text von einem anderen Ansichtscontroller, der sich momentan hinter dem Controller befindet, dem übergeordneten Ansichtscontroller. Bedeutet es jetzt transparent. Kann mir jemand sagen, was ich falsch mache? 

46
AJ112

Die neueste Version von iOS hat viele visuelle Änderungen mit sich gebracht, und aus Sicht des Entwicklers sind die Navigations- und Statusleiste zwei auffällige Änderungen. 

Die Statusleiste ist jetzt transparent und die Navigationsleiste dahinter ist durchscheinend. Das Navigationsleistenbild kann sogar hinter der Statusleiste erweitert werden. 

Wenn Sie erst Anfänger sind und gerade mit der iOS-Entwicklung begonnen haben und die Funktionsweise der Statusleiste und der Navigationsleiste verwirrt ist, können Sie einfach einen Blogbeitrag HERE lesen, den ich sehr nützlich fand. Es enthält alle Informationen zur Navigation und Statusleiste in iOS 7.

Nun kommen wir zur Antwort auf Ihre Frage. Zunächst kann ich zwei verschiedene Probleme sehen. Zum einen kollidieren sowohl Ihre Statusleiste als auch Ihre Navigationsleiste miteinander, wie Sie es in der Frage mit einem Bild gezeigt haben. 

PROBLEM: Nun, das Problem ist, dass Sie zuvor eine Navigationsleiste in Ihren View-Controller gezogen haben, die in iOS 6 ordnungsgemäß funktioniert hat. Mit der Einführung von iOS 7 SDK führt dieser Ansatz jedoch dazu, dass sich Statusleiste und Navigationsleiste überlappen gegenseitig. 

LÖSUNG zum ersten Problem: Sie können entweder UIBarPositionTopAttached oder Ansichtsbegrenzungen und Frames verwenden. Ich kann Sie auch vorschlagen und einen Link zu Apples Dokumentation und Bla Bla Bla erstellen, dies würde jedoch einige Zeit dauern das Problem lösen 

Der beste und einfachste Weg, dieses Problem zu lösen, besteht darin, Ihren View Controller einfach in einen Navigationscontroller einzubetten. Sie können dies tun, indem Sie einfach den Ansichtscontroller auswählen und zu Editor> Einbetten in> Navigationscontroller wechseln. (Wenn sich in Ihrer alten Navigationsleiste Inhalte befinden, können Sie sie zuerst nach unten ziehen, den View Controller in den Navigationscontroller einbetten und dann die Schaltflächen der Leiste in der neuen Navigationsleiste verschieben und dann die alte Navigationsleiste löschen.)

LÖSUNG zum zweiten Problem: Diese Lösung bezieht sich auf Ihre spezifische Frage, die Sie im Update erwähnt haben, und ist nicht für die allgemeine Öffentlichkeit gedacht. Wie Sie sehen, ist die Navigations- und Statusleiste nicht sichtbar und der transparente Bereich zeigt den übergeordneten View-Controller. Ich benutze nicht wirklich, warum Sie mit diesem Problem konfrontiert sind, aber höchstwahrscheinlich aufgrund von Bibliotheken anderer Anbieter wie ECSlidingView oder anderen. Sie können diesen Ansichts-Controller in Ihrem Storyboard auswählen und die Hintergrundfarbe der Ansicht so einstellen, dass sie der Navigationsleiste entspricht. Dadurch wird der übergeordnete View-Controller nicht mehr dahinter angezeigt, und Ihre Navigationsleiste und Statusleiste werden angezeigt. Jetzt können Sie den Rest Ihres View Controllers mit der Textansicht oder was auch immer Sie verwenden, abdecken. 

Hoffe das hilft!

66
KC.

Die Navigationsleiste befindet sich zu nahe an der Statusleiste, da die Statusleiste ab iOS 7 eher eine Überlagerung der gesamten Ansicht des Controller ist. Da sich Ihre Navigationsleiste bei (0, 0) befindet, wird die Statusleiste oben in der Navigationsleiste angezeigt. Um dieses Problem zu lösen, verschieben Sie einfach die Navigationsleiste nach unten (oder erstellen Sie, wie andere bereits gesagt haben), eine Einschränkung zwischen der Navigationsleiste und dem topLayoutGuide.

Wenn Sie dies tun, werden Sie feststellen, dass zwischen der Navigationsleiste und dem oberen Rand des Bildschirms jetzt ein Abstand von 20 Punkten besteht. Das liegt daran, dass Sie die Navigationsleiste um 20 Punkte nach unten verschoben haben. "Aber UINavigationController kann es richtig machen!" Absolut, und zwar durch die Implementierung von UIBarPositioningDelegate in Ihrem View-Controller. Dies ist ein Ein-Methoden-Protokoll, das folgendermaßen implementiert werden sollte:

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
    return UIBarPositionTopAttached;
}

Nachdem Sie Ihren View Controller als Delegaten für die Navigationsleiste hinzugefügt haben, werden Sie feststellen, dass die Navigationsleiste immer noch um 20 Punkte nach unten verschoben ist. Der Hintergrund wird jedoch wie in UINavigationController unter der Statusleiste angezeigt.

Eine andere Sache, die Sie sehen, ist, dass die Navigationsleiste durchscheinend ist, was bedeutet, dass alles unter der Navigationsleiste einigermaßen sichtbar ist. Die translucent-Eigenschaft für UINavigationBar ist unter iOS 7 standardmäßig auf YES festgelegt. Vor iOS 7 war der Standardwert NO.

33

sie können das einfach tun:

1) Fügen Sie eine Einschränkung zwischen der Navigationsleiste und Oberer Layout Guide hinzu (wählen Sie die Navigationsleiste aus, halten Sie die Strg-Taste gedrückt und gehen Sie zu Bottom Layout Guide, drücken Sie die Strg-Taste)

Add vertical Contrain

2) wählen Sie vertikaler Abstand :

vertical spacing

3) Setze konstant auf 0 :

vertical spacing constant

Ergebnis:

result

UPDATE

In Ihrer AppDelegate-Datei können Sie Folgendes hinzufügen:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
{
  // Prevent Navigationbar to cover the view
  UINavigationBar.appearance().translucent = false
}
4
Masterfego

Ich schlage vor, Sie versuchen in Ihrer viewDidLoad-Methode:

self.navigationController.navigationBar.translucent = NO;

(standardmäßig ist es jetzt ja)

https://developer.Apple.com/library/ios/documentation/uikit/reference/UINavigationBar_Class/Reference/UINavigationBar.html#//Apple_ref/occ/instp/UINavigationBar/translucent

3
The dude

Wenn sich Ihre UIViewController NICHT in einer UINavigationController befindet und Sie UIStoryBoard verwenden, können Sie "iOS 6/7 Deltas" für das Delta Y auf 20 setzen, und zwar für jede Unteransicht, die gegenüber der UIStatusBar versetzt werden muss.

enter image description here

2
Nate Potter

Mit Swift :

Wie @Scott Berrevoets in seiner Antwort sagte, müssen Sie die Methode positionForBar im Protokoll UIBarPositioningDelegate implementieren, aber wie das UINavigationBarDelegate-Protokoll dieses Protokoll implementiert:

public protocol UINavigationBarDelegate : UIBarPositioningDelegate {
   ...
}

Sie müssen lediglich die delegate der UINavigationBar, die Sie mit dem Storyboard festgelegt haben, festlegen und die Methode implementieren, und das geschieht wie folgt:

class ViewController: UIViewController, UINavigationBarDelegate {

   @IBOutlet weak var navigationBar: UINavigationBar!

   override func viewDidLoad() {
       super.viewDidLoad()
       self.navigationBar.delegate = self 
   }

   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
   }

   func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
       return UIBarPosition.TopAttached
   }
}

HINWEIS: Es ist erwähnenswert, wenn Sie die Position der y-Achse der Navigationsleiste festlegen, sagen wir von oben auf 40, dann wird sie von unten nach oben reichen position, um das Verhalten der UINavigationController zu simulieren, die Sie von oben auf 20 setzen müssen.

Ich hoffe es hilft dir.

2
Victor Sigler

Dies funktioniert für mich, ich hoffe, Sie haben auch das gleiche Glück:) .
Fügen Sie den folgenden Code in Ihre Ansicht ein.

-(void) viewDidLayoutSubviews
{
    CGRect tmpFram = self.navigationController.navigationBar.frame;
    tmpFram.Origin.y += 20;
    self.navigationController.navigationBar.frame = tmpFram;
}

Im Wesentlichen wird der Ort der Navigationsleiste geändert.

2
Jageen

Falls es noch jemandem hilft, hat es mir in ios 7 und höher gelingen, die Navigationsleiste etwas nach unten zu bewegen:

-(void)viewWillLayoutSubviews
{
    float iosVersion = 7.0;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= iosVersion) {
        // iOS 7+
        CGRect viewFrame = self.view.frame;
        viewFrame.Origin.y += 10;
        self.view.frame = viewFrame;
    }
}

Auf einem Gerät mit iOS 6.1 und darunter bleibt die Navigationsleiste unverändert wie zuvor.

Und so habe ich den Inhalt der Statusleiste leichter gemacht:

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}
2
derekg

Setzen Sie UIViewControllerBasedStatusBarAppearance in Info.plist ..__ auf NO. Dann fügen Sie in AppDelegate die application:didFinishLaunchingWithOptions:-Methode hinzu:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
   [application setStatusBarStyle:UIStatusBarStyleLightContent];
   self.window.clipsToBounds = YES;
   self.window.frame = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height-20);
   self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
 }
 return YES;
2
PJR

Dies ist eine neue Funktion von IOS7. Statt in 20 Pixeln die Navigationsleiste in IOS7 anstarren zu lassen und auf 0 px zu starren. Verschieben Sie als Lösung die gesamte Ansicht nach unten auf 20 px oder verwenden Sie ein Bild für die Navigationsleiste mit einer Höhe von 64px.

2
PgmFreek

in früheren iOS-Fenstern wird nach der Statusleiste gestartet, und in iOS 7 beginnt das Fenster mit 0px. In früheren Versionen beträgt die Höhe 460 (iPhone 4s und früher) und 548 (iPhone 5), in iOS 7 jedoch 480 (iPhone 4s und früher) und 568 (iPhone 5 und höher) Sie müssen also die Ansichtsanordnung nach 2o px oder die Ansicht von 20px starten.

sie können den folgenden Code in rootviewcontroller oder in all viewcontroller für die gesetzte Ansicht von 20px schreiben

#define IOS7_HEIGHT             64

- (void)viewDidLayoutSubviews {
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
    {
        CGRect frame=[self.view frame];
        if (frame.Origin.y!=IOS7_HEIGHT) {

            frame.Origin.y = IOS7_HEIGHT;
            frame.size.height -= IOS7_HEIGHT;
            [self.view setFrame:frame];
            [self.view layoutSubviews];
        }
    }
}

hier ist die Höhe 64, da 20 für die Statusleiste und 44 für die Navigationsleiste verwendet werden. Versuchen Sie es mit dem Code, der Ihnen hilft. und dein Problem wird gelöst. 

1
Pratik

Für diejenigen, die Probleme mit der Implementierung der @ MasterFego-Lösung haben (dies ist auch die offizielle, aber ich hatte Probleme mit Xcode 6.3 und automatischen Einschränkungen), habe ich Folgendes getan:

Ich habe einen UIViewController mit einer zusätzlichen Navigationsleiste. Ich habe die NAvigation-Leiste ausgewählt und eine Höhenbeschränkung von 64px hinzugefügt. Später sehen wir eine Warnung, dass die Navigationsleiste höher sein wird (was wir jedoch tun). Schließlich können Sie sehen, dass die Statusleiste schön aussieht und dieselbe Farbe wie die Navigationsleiste hat. :) 

PS: Ich kann noch keine Bilder posten. 

1
cduguet

In iOS 7 beansprucht die App 100% der Bildschirmgröße. Dies ist kein Problem . http://www.doubleencore.com/2013/09/developers-guide-to-the-ios-7-status-bar/

1
Amulya

Sie können wahrscheinlich Einschränkungen erstellen, die an die obere Layouthilfe angehängt sind, um die Position der Navigationsleiste relativ zur Statusleiste anzugeben. Weitere Informationen zur Verwendung der Layout-Anleitungen finden Sie im Abschnitt iOS 7 UI-Übergangshandbuch: Aussehen und Verhalten .

0
Greg

das ist die beste Antwort. Aber ich wollte wissen, wie man ein Storyboard benutzt und zog UINavigationBar darauf. Als ich die Delegate-Methode implementiert und das Rückgabeergebnis auf UIBarPositionTopAttached gesetzt habe, hat es nicht funktioniert.

- (void)viewDidLoad{
    self.navigationbar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar{
    NSLog(@"Got it");
    //
    //    CGRect frame = self.navigaitonBar.frame;
    //
    //    frame = CGRectMake(0, 20, CGRectGetWidth(frame), CGRectGetHeight(frame));
    //    self.navigaitonBar.frame = frame;
    //
    //    NSLog(@"frame %f",frame.Origin.y);
    return UIBarPositionTopAttached;
}
0
rbbtsn0w

Wenn Sie Xcode 6 und Swift verwenden, können Sie Folgendes erstellen:

  1. Öffnen Sie die info.plist-Datei Ihrer App.
  2. Fügen Sie einen booleschen ViewControllerBasedStatusBarAppearance-Schlüssel hinzu, wenn er nicht vorhanden ist, und weisen Sie den Wert "NO" zu.
  3. Fügen Sie die Taste „Statusleistenstil“ hinzu, wenn sie nicht vorhanden ist, und wählen Sie den Wert „Schwarzweißstil“.
0
Alexsander

Ich hatte ein Problem, als der ModalViewController von MainViewController auf dem ganzen Bildschirm geöffnet wurde. Die NavigationBar-Position wurde geändert, als der Benutzer von MainViewController auf ModalViewController zurückkehrte.

Das Problem, das mir aufgefallen ist, dass die Höhe der Statusleiste angezeigt wurde, wurde nicht berücksichtigt, als der Benutzer zu MainViewController zurückkehrte. Bitte debuggen Sie und überprüfen Sie Origin von Ihrem NavigationBar, bevor Sie zu Ihrem ViewController zurückkehren.

// This method will adjust navigation bar and view content.
    private func adjustNavigationControllerIfNeeded() {

        var frame = self.view.frame
        let navigationBarHeight = self.navigationController!.navigationBar.frame.size.height

        if(frame.Origin.y == navigationBarHeight && !UIApplication.shared.isStatusBarHidden) { 

   // If status bar height is not included but it is showing then we have to adjust 
      our Navigation controller properly

            print("Adjusting navigation controller")
            let statusBarHeight = UIApplication.shared.statusBarFrame.height

            frame.Origin.y += statusBarHeight // Start view below navigation bar
            frame.size.height -= statusBarHeight
            self.view.frame = frame

            self.navigationController!.navigationBar.frame.Origin.y = statusBarHeight // Move navigation bar
        }
    }

Und rufen Sie es aus der viewWillAppear-Methode auf -

override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)
        self.adjustNavigationControllerIfNeeded()
}
0
Rahul