536 Stimmen

Wie man die 1px untere Linie der UINavigationBar ausblendet

Ich habe eine App, bei der die Navigationsleiste manchmal mit dem Inhalt verschmelzen muss.

Weiß jemand, wie man diese lästige kleine Leiste loswerden oder ihre Farbe ändern kann?

Auf dem Bild unten habe ich die Situation - ich spreche von dieser 1px hohen Linie unter "Root View Controller"

Bildbeschreibung hier eingeben

10voto

Alvivi Punkte 3163

Ich verwende eine UINavigationBar-Erweiterung, die es mir ermöglicht, diesen Schatten unter Verwendung der UIAppearance-API auszublenden/einzublenden oder auszuwählen, welcher Navigationsleiste über Storyboard (oder Quellcode) diesen Schatten ausblenden/einblenden soll. Hier ist die Erweiterung:

import UIKit

private var flatAssociatedObjectKey: UInt8 = 0

/*
  Eine Erweiterung, die ein Feld "flat" zur UINavigationBar hinzufügt. Dieses Flag entfernt den Schatten unter der Navigationsleiste, wenn es aktiviert ist.
 */
@IBDesignable extension UINavigationBar {
    @IBInspectable var flat: Bool {
        get {
            guard let obj = objc_getAssociatedObject(self, &flatAssociatedObjectKey) as? NSNumber else {
                return false
            }
            return obj.boolValue;
        }

        set {
            if (newValue) {
                let void = UIImage()
                setBackgroundImage(void, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = void
            } else {
                setBackgroundImage(nil, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = nil
            }
            objc_setAssociatedObject(self, &flatAssociatedObjectKey, NSNumber(bool: newValue),
                    objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

Um den Schatten über alle Navigationsleisten hinweg auszublenden, muss Folgendes verwendet werden:

UINavigationBar.appearance().flat = true

Oder Sie können dieses Verhalten über Storyboards aktivieren/deaktivieren:

Navigation Bar Storyboard

7voto

UnRewa Punkte 2444

Swift hat dies platziert

UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: .Any, barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()

in

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool

7voto

jhurliman Punkte 1595

Ein weiteres Option, wenn Sie die Transluzenz beibehalten möchten und nicht jeden UINavigationController in Ihrer App unterklassifizieren möchten:

#import 

@implementation UINavigationController (NoShadow)

+ (void)load {
    Method original = class_getInstanceMethod(self, @selector(viewWillAppear:));
    Method swizzled = class_getInstanceMethod(self, @selector(swizzled_viewWillAppear:));
    method_exchangeImplementations(original, swizzled);
}

+ (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
        return (UIImageView *)view;
    }

    for (UIView *subview in view.subviews) {
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];
        if (imageView) {
            return imageView;
        }
    }

    return nil;
}

- (void)swizzled_viewWillAppear:(BOOL)animated {
    UIImageView *shadow = [UINavigationController findHairlineImageViewUnder:self.navigationBar];
    shadow.hidden = YES;

    [self swizzled_viewWillAppear:animated];
}

@end

6voto

James Punkte 71
Etwas schnelle Lösung 
func setGlobalAppearanceCharacteristics () {
    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.white
    navigationBarAppearace.barTintColor = UIColor.blue
    navigationBarAppearace.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navigationBarAppearace.shadowImage = UIImage()

}

5voto

Evgenii Mokeev Punkte 71

Zwei Zeilen Lösung, die für mich funktioniert. Versuchen Sie, dies in der Methode ViewDidLoad hinzuzufügen:

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X