web-dev-qa-db-de.com

Wie kann ich den Navigationsleistenschatten in iOS 6 für Navigationsleisten mit benutzerdefinierten Hintergrundbilder deaktivieren?

Es scheint, dass in iOS 6 automatisch ein Schlagschatten zur Navigationsleiste hinzugefügt wird, auch wenn Sie ein benutzerdefiniertes Hintergrundbild festlegen. Ich bin mir ziemlich sicher, dass dies bei iOS 5 nicht der Fall war, denn wenn ich den gleichen Code in der iOS 5 und 6 sim teste, erscheint der Schatten in iOS 6, aber nicht 5.

Weiß jemand etwas davon? Oder wie kann ich es aktivieren/deaktivieren?

50
Dom Chapman

Platzieren Sie dies in Ihrer AppDelegate

[[UINavigationBar appearance] setShadowImage:[UIImage new]];
// is IOS 7 and later
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

Das hat es für mich getan. Ich hoffe es hilft!

Schnelle Version mit Updates aus Kommentaren

    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
141
Kevin Fernandes

Ich weiß, dass dies mit komplizierteren Antworten oben gelöst wurde, aber dies ist der schnellste und einfachste Weg, den Schatten unter der Navigationsleiste zu verbergen.

self.navigationController.navigationBar.clipsToBounds = YES;
57
Hank Brekke

Hinweis aus den Apple-Entwicklerdokumenten zum Thema shadowImage:

Diskussion: Der Standardwert ist nil, was dem Standardwert .__ entspricht. Schattenbild. Ist dies nicht der Fall, stellt diese Eigenschaft einen benutzerdefinierten Schatten dar Bild, das anstelle der Standardeinstellung angezeigt werden soll. Damit ein benutzerdefiniertes Schattenbild .__ ist. Wie gezeigt, muss ein benutzerdefiniertes Hintergrundbild auch mit der .__ festgelegt werden. setBackgroundImage: forBarMetrics: Methode. Wenn der Standardhintergrund Wenn ein Bild verwendet wird, wird das Standardschattenbild unabhängig von .__ verwendet. des Wertes dieser Eigenschaft.

Um den nil UIImage-Hack verwenden zu können, müssen Sie auch ein benutzerdefiniertes Hintergrundbild für die Navigationsleiste einstellen. Dies kann auch ein Nullbild sein, was zu einer Nizza flachen, sauberen U-Bahn-Navigationsleiste führt:

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
        [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
25
Lee Probert

Sie können dies auch versuchen:

controller.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];

controller ist ein UINavigationController.

19
Dima Korbin

Allgemeine, nicht NDA-verletzende Antwort:

Wenn Sie nicht möchten, dass etwas aus einer Ebene herausragt, maskieren Sie die Ebene bis zu ihren Grenzen.

[self.layer setMasksToBounds:YES];

Setzen Sie die Höhe explizit auf 44 (oder 32 für Querformat auf dem iPhone), wenn dies nicht alleine funktioniert.

7
Steve Cotner

Wenn Sie das shadowImage auf ein Nullbild setzen, funktioniert es. Die Darstellung der Lösung führt jedoch dazu, dass eine Eigenschaft hinzugefügt wird, wenn das Betriebssystem vor iOS 6 ist.

Eine bessere Möglichkeit, etwas zu tun, das von der Existenz einer Eigenschaft oder Methode abhängig ist, ist:

if ([self.navigationController.navigationBar
respondsToSelector:@selector(shadowImage)]) {
self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
}
6
user1202579

Es gibt zwei mögliche Lösungen, von denen die zweite in anderen Antworten erwähnt wird.

  1. Fügen Sie ein einzelnes transparentes Pixel am unteren Rand des Hintergrundbilds der Navigationsleiste hinzu. Dadurch werden die Schatten in iOS 6 deaktiviert.
  2. Implementieren Sie den folgenden Code:

    // Omit the conditional if minimum OS is iOS 6 or above
    if ([UINavigationBar instancesRespondToSelector:@selector(setShadowImage:)]) {
        [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
    }
    

Quelle: Erweiterte Darstellung des Aussehens unter iOS , @ 27: 15

3
eager

Da self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]; nicht funktioniert, habe ich einen einfachen und praktikablen Weg gefunden, um den Schatten von UINavigationBar sowohl in iOS 6 als auch in iOS 5 zu entfernen. Ich hoffe, Leute, die dies benötigen, können diesen Beitrag sehen.

Sie müssen lediglich ein Hintergrundbild so vorbereiten, dass die Höhe 1 Pixel größer ist als die Höhe Ihrer Navigationsleiste (z. B. 320 × 45 für die Standardeinstellung UINavigationBar, 640 × 90 für 2x).

Dann verwenden Sie einfach [[UINavigationBar appearance] setBackgroundImage: ...]. Sie werden feststellen, dass der Schatten durch diesen 1 Pixel ersetzt wird. Prost!

Übrigens fand ich, dass Twitter genau das Gleiche getan hat, wenn Sie Twitter.ipa entpacken und in bg_nav_bar_events_dark.png schauen, ist die Größe 320 × 47. Sie haben ihren eigenen Schatten für 3 Pixel erstellt :)

2
xiaobo

Ich bin auf diese SO - Frage gestoßen, als ich versuche, dass Navigationsleisten zwischen iOS6 und iOS7 gleich aussehen.

Die Antwort, die ich gefunden habe, war einfach zu gebrauchen:

    NSMutableDictionary *titleBarAttributes = [NSMutableDictionary dictionaryWithDictionary: [[UINavigationBar appearance] titleTextAttributes]];
    [titleBarAttributes setValue:[NSNumber numberWithInt:0] forKey:UITextAttributeTextShadowOffset];
    [[UINavigationBar appearance] setTitleTextAttributes:titleBarAttributes];

dh: Setzen Sie den Schattenversatz auf Null.

1
CharlesA

Ich kann nicht kommentieren, also füge ich meine Informationen hier hinzu.

Vielleicht haben die obigen Vorschläge in der Beta funktioniert, aber es scheint jetzt nicht der Fall zu sein.

self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];

Das obige funktioniert nicht und auch keine der anderen ähnlichen Antworten oben. Ich habe sie alle ausprobiert.

Das Abschneiden von Begrenzungen funktioniert zwar, liefert jedoch nicht das gewünschte Ergebnis, da andere Ansichten außerhalb der Navigationsleiste angezeigt werden sollen.

1

Wie wäre es mit dem alternativen Weg:

UINavigationBar.appearance().barStyle = .Black

Für die dunklen Navigationsleisten zeigt iOS den Schatten nicht an.

1
SoftDesigner

Ich hatte das gleiche Problem und habe es mit folgendem gelöst:

CustomNavBar *navBar = (CustomNavBar *)self.navigationController.navigationBar;
        [navBar setBackgroundImage:[UIImage imageNamed:@"navigation_bar_gray.png"] forBarMetrics:UIBarMetricsDefault];
        navBar.shadowImage = [[UIImage alloc]init]; // this is what acctually removed the shadow under navigation bar 
0
Dejan Balaban

In Swift 3.0 würde dies so aussehen

UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
0
Kumar C