wake-up-neo.com

So verstecken Sie UINavigationBar 1px unter dem Strich

Ich habe eine App, die manchmal eine Navigationsleiste benötigt, um sich in den Inhalt einzufügen.

Weiß jemand, wie man diese nervige kleine Leiste loswird oder ihre Farbe ändert?

Auf dem Bild unten Situation habe ich - ich spreche über diese 1px Höhenlinie unter "Root View Controller"

enter image description here

406
Szymon Kuczur

Dazu sollten Sie ein benutzerdefiniertes Schattenbild festlegen. Damit das Schattenbild angezeigt wird, müssen Sie jedoch ein benutzerdefiniertes Hintergrundbild festlegen. Dies ist in der Dokumentation von Apple angegeben:

Damit ein benutzerdefiniertes Schattenbild angezeigt wird, muss auch ein benutzerdefiniertes Hintergrundbild mit der Methode setBackgroundImage (_: for :) festgelegt werden. Wenn das Standardhintergrundbild verwendet wird, wird das Standardschattenbild unabhängig vom Wert dieser Eigenschaft verwendet.

Damit:

let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
                                                        for: .default)
navigationBar.shadowImage = UIImage()

Oben ist der einzige "offizielle" Weg, um es zu verbergen. Leider wird die Lichtdurchlässigkeit des Balkens entfernt.

Ich will kein Hintergrundbild, nur Farbe

Sie haben folgende Möglichkeiten:

  1. Einfarbig, keine Transluzenz:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
    
  2. Erstellen Sie ein kleines Hintergrundbild mit Farbe und verwenden Sie es.

  3. Verwenden Sie die unten beschriebene "Hacky" -Methode. Es wird auch bar durchscheinend halten.

Wie hält man den Balken durchscheinend?

Um die Transparenz zu erhalten, benötigen Sie einen anderen Ansatz. Er sieht aus wie ein Hack, funktioniert aber gut. Der Schatten, den wir entfernen möchten, ist ein Haarstrich UIImageView irgendwo unter UINavigationBar. Wir können es finden und bei Bedarf ein- und ausblenden.

In den folgenden Anweisungen wird davon ausgegangen, dass Sie den Haaransatz nur in einem Controller Ihrer UINavigationController -Hierarchie verstecken müssen.

  1. Instanzvariable deklarieren:

    private var shadowImageView: UIImageView?
    
  2. Füge eine Methode hinzu, die diesen Schatten (Haaransatz) findet UIImageView:

    private func findShadowImage(under view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1 {
            return (view as! UIImageView)
        }
    
        for subview in view.subviews {
            if let imageView = findShadowImage(under: subview) {
                return imageView
            }
        }
        return nil
    }
    
  3. viewWillAppear/viewWillDisappear Methoden hinzufügen/bearbeiten:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        if shadowImageView == nil {
            shadowImageView = findShadowImage(under: navigationController!.navigationBar)
        }
        shadowImageView?.isHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        shadowImageView?.isHidden = false
    }
    

Die gleiche Methode sollte auch für UISearchBar Haaransatz und (fast) alles andere funktionieren, was du verstecken musst :)

Vielen Dank an @Leo Natan für die originelle Idee!

661

Unten kann einfach geholfen werden!

Swift:

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

Ziel C:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
208
Vishnuvardhan

Wenn Sie nur eine durchgehende Navigationsleistenfarbe verwenden möchten und diese in Ihrem Storyboard eingerichtet haben, verwenden Sie diesen Code in Ihrer Klasse AppDelegate, um den 1-Pixel-Rand über den Darstellungs-Proxy zu entfernen:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
                                  forBarPosition:UIBarPositionAny
                                      barMetrics:UIBarMetricsDefault];

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
142
Rick Pastoor

Versuche dies:

[[UINavigationBar appearance] setBackgroundImage: [UIImage new]  
                                   forBarMetrics: UIBarMetricsDefault];

[UINavigationBar appearance].shadowImage = [UIImage new];

Unteres Bild hat die Erklärung (iOS7 NavigationBar):

enter image description here

Und überprüfen Sie diese SO Frage: iOS7 - UINavigationBar Randfarbe ändern

95
null

Wollte die Swift Version von Serhiis Antwort hinzufügen. Ich habe einen UIBarExtension.Swift mit folgendem Inhalt erstellt:

import Foundation
import UIKit

extension UINavigationBar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIToolbar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIView {
    fileprivate var hairlineImageView: UIImageView? {
        return hairlineImageView(in: self)
    }

    fileprivate func hairlineImageView(in view: UIView) -> UIImageView? {
        if let imageView = view as? UIImageView, imageView.bounds.height <= 1.0 {
            return imageView
        }

        for subview in view.subviews {
            if let imageView = self.hairlineImageView(in: subview) { return imageView }
        }

        return nil
    }
}
61
pxpgraphics

Der Swift Weg dies zu tun:

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

UINavigationBar.appearance().shadowImage = UIImage()
59
OscarVGG

Einfache Lösung in Swift

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
18
Jakub Průša

Nachdem ich die Antwort von Serhil gelesen hatte, erstellte ich einen Pod INavigationBar + Addition , mit dem sich der Haaransatz leicht verbergen lässt.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *navigationBar = self.navigationController.navigationBar;
    [navigationBar hideBottomHairline];
}
16
samwize

In Swift 3.0

Bearbeiten Sie Ihren AppDelegate.Swift, indem Sie Ihrer Anwendungsfunktion den folgenden Code hinzufügen:

// Override point for customization after application launch.

// Remove border in navigationBar
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
13
smohn

pxpgraphics 'Lösung aktualisiert für Swift 2.0

extension UINavigationBar {

    func hideBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = true
    }

    func showBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = false
    }

    private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

        for subview: UIView in view.subviews
        {
            if let imageView = hairlineImageViewInNavigationBar(subview)
            {
                return imageView
            }
        }

        return nil
    }

}

extension UIToolbar
{

    func hideHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = true
    }

    func showHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = false
    }

    private func hairlineImageViewInToolbar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

        for subview: UIView in view.subviews
        {
            if let imageView = hairlineImageViewInToolbar(subview)
            {
                return imageView
            }
        }

        return nil
    }

}
11
tf.alves

Swift 4 // zum Ausblenden der Schattenlinie der Navigationsleiste

navigationController?.navigationBar.shadowImage = UIImage()
10
Faris Muhammed

Ich verwende eine UINavigationBar-Erweiterung, mit der ich diesen Schatten mithilfe der UIAppearance-API ausblenden/anzeigen oder auswählen kann, welche Navigationsleiste diesen Schatten mithilfe von Storyboard (oder Quellcode) ausblenden/anzeigen soll. Hier ist die Erweiterung:

import UIKit

private var flatAssociatedObjectKey: UInt8 = 0

/*
  An extension that adds a "flat" field to UINavigationBar. This flag, when
  enabled, removes the shadow under the navigation bar.
 */
@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 auf allen Navigationsleisten zu deaktivieren, müssen Sie Folgendes verwenden:

UINavigationBar.appearance().flat = true

Oder Sie können dieses Verhalten mithilfe von Storyboards aktivieren/deaktivieren:

Navigation Bar Storyboard

10
Alvivi

Kann auch im Storyboard ausgeblendet werden (arbeitet mit Xcode 10.1)

Durch Hinzufügen des Laufzeitattributs: hidesShadow - Boolean - True

enter image description here

10

Swift 4 Tested LÖSUNG EINER LEITUNG

In Viewdidload() den Standardwert des Navigationscontrollers für den Schlüssel "hidesShadow" auf true setzen

override func viewDidLoad() {
    super.viewDidLoad()

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

}
9
Sachin Rasane

Eine weitere Option, wenn Sie die Transparenz erhalten und nicht alle UINavigationController in Ihrer App in Unterklassen unterteilen möchten:

#import <objc/runtime.h>

@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
7
jhurliman

Swift hat das gesagt

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

im

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

Lösung in Swift 4.2:

private func removeHairlineFromNavbar() {
    UINavigationBar.appearance().setBackgroundImage(
        UIImage(),
        for: .any,
        barMetrics: .default)
    UINavigationBar.appearance().shadowImage = UIImage()
}

Stellen Sie diese Funktion einfach in den ersten Viewcontroller und rufen Sie sie in viewdidload auf.

5
Mattk90
Slightly Swift Solution 
func setGlobalAppearanceCharacteristics () {
    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.white
    navigationBarAppearace.barTintColor = UIColor.blue
    navigationBarAppearace.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navigationBarAppearace.shadowImage = UIImage()

}
5
James

Wenn Sie in iOS8 den UINavigationBar.barStyle auf .Black setzen, können Sie den Hintergrund der Leiste als normale Farbe ohne Rand festlegen.

In Swift:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
4
gpbl

Ab iOS 13 gibt es eine System-API zum Setzen oder Entfernen des Schattens

UIKit verwendet shadowImage und die shadowColor-Eigenschaft, um das Erscheinungsbild des Schattens zu bestimmen. Wenn shadowImage Null ist, zeigt die Leiste einen Standardschatten an, der gemäß dem Wert in der shadowColor-Eigenschaft getönt ist. Wenn shadowColor null ist oder die Farbe clearColor enthält, wird in der Leiste kein Schatten angezeigt.

    let appearance = UINavigationBarAppearance()
    appearance.shadowImage = nil
    appearance.shadowColor = nil
    navigationController.navigationBar.standardAppearance = appearance
3
glotcha

Hier ist eine sehr einfache Lösung:

self.navigationController.navigationBar.clipsToBounds = YES;
3
user3344977

Das Problem beim Einstellen eines Hintergrundbilds besteht darin, dass Unschärfen beseitigt werden. Sie können es entfernen, ohne ein Hintergrundbild festzulegen. Siehe meine Antwort hier .

2
Leo Natan

Sie sollten eine Ansicht unten in der UISearchBar hinzufügen

let rect = searchController.searchBar.frame;
let lineView : UIView = UIView.init(frame: CGRect.init(x: 0, y: rect.size.height-1, width: rect.size.width, height: 1))
lineView.backgroundColor = UIColor.init(hexString: "8CC73E")
searchController.searchBar.addSubview(lineView)
2
Socheat

Für iOS 9-Benutzer hat dies bei mir funktioniert. füge einfach folgendes hinzu:

UINavigationBar.appearance().shadowImage = UIImage()
1
Mariano Pardo

Innerhalb von AppDelegate hat dies das Format der NavBar global geändert:

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

    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().barTintColor = UIColor.redColor()
    UINavigationBar.appearance().translucent = false
    UINavigationBar.appearance().clipsToBounds = false
    UINavigationBar.appearance().backgroundColor = UIColor.redColor()
    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }

Habe es nicht geschafft, etwas anderes auf einem bestimmten VC zu implementieren, aber dies wird 90% der Menschen helfen

1
David West

die Antwort von pxpgraphics für Swift 3.0.

import Foundation
import UIKit

extension UINavigationBar {

  func hideBottomHairline() {
    let navigationBarImageView = hairlineImageViewInNavigationBar(view: self)
    navigationBarImageView!.isHidden = true
  }

  func showBottomHairline() {
    let navigationBarImageView = hairlineImageViewInNavigationBar(view: self)
    navigationBarImageView!.isHidden = false
  }

  private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView? {
    if view is UIImageView && view.bounds.height <= 1.0 {
      return (view as! UIImageView)
    }

    let subviews = (view.subviews as [UIView])
    for subview: UIView in subviews {
      if let imageView: UIImageView = hairlineImageViewInNavigationBar(view: subview) {
        return imageView
      }
    }
    return nil
  }
}

extension UIToolbar {

  func hideHairline() {
    let navigationBarImageView = hairlineImageViewInToolbar(view: self)
    navigationBarImageView!.isHidden = true
  }

  func showHairline() {
    let navigationBarImageView = hairlineImageViewInToolbar(view: self)
    navigationBarImageView!.isHidden = false
  }

  private func hairlineImageViewInToolbar(view: UIView) -> UIImageView? {
    if view is UIImageView && view.bounds.height <= 1.0 {
      return (view as! UIImageView)
    }

    let subviews = (view.subviews as [UIView])
    for subview: UIView in subviews {
      if let imageView: UIImageView = hairlineImageViewInToolbar(view: subview) {
        return imageView
      }
    }
    return nil
  }
}
1
Reza Shirazian

Einfache Lösung - Swift 5

  1. Erstellen Sie eine Erweiterung:

    extension UIImage {
    
        class func hideNavBarLine(color: UIColor) -> UIImage? {
    
            let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()
            context?.setFillColor(color.cgColor)
            context?.fill(rect)
    
    
            let navBarLine = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return navBarLine
        }
    }
    
  2. Fügen Sie dies zu viewDidLoad() hinzu:

    self.navigationController?.navigationBar.shadowImage = UIImage.hideNavBarLine(color: UIColor.clear)
    
1
Bandyliuk

Ich weiß, dass dies ein alter Thread ist, aber ich habe eine Lösung gefunden, die wirklich gut funktioniert:

Unterklasse UINavigationBar. Überschreiben Sie in Ihrer Unterklasse UINavigationBar didAddSubview mit dem folgenden Code:

- (void)didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UIImageView class]]) {
        [subview setClipsToBounds:YES];
    }
}
1
Joel Middendorf

Ich habe gerade eine Erweiterung dafür erstellt ... Entschuldigen Sie die Formatierung (dies ist meine erste Antwort).

Verwendungszweck:

  override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.hideShadow = true
}

Erweiterung:

 UINavigationController.Swift
//  Created by Ricardo López Rey on 16/7/15.

import Foundation


struct UINavigationControllerExtension {
    static var hideShadowKey : String = "HideShadow"
static let backColor = UIColor(red: 247/255, green: 247/255, blue: 248/255, alpha: 1.0)
}

extension UINavigationController {

    var hideShadow : Bool {
        get {
            if let ret =  objc_getAssociatedObject(self, &UINavigationControllerExtension.hideShadowKey) as? Bool {
                return ret
            } else {
                return false
            }


        }
        set {
            objc_setAssociatedObject(self,&UINavigationControllerExtension.hideShadowKey,newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))

            if newValue {


            self.navigationBar.setBackgroundImage(solidImage(UINavigationControllerExtension.backColor), forBarMetrics: UIBarMetrics.Default)

                self.navigationBar.shadowImage = solidImage(UIColor.clearColor())
            } else {
                self.navigationBar.setBackgroundImage(nil, forBarMetrics: UIBarMetrics.Default)
            }
        }
    }

    private func solidImage(color: UIColor, size: CGSize = CGSize(width: 1,height: 1)) -> UIImage {
        var rect = CGRectMake(0, 0, size.width, size.height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(rect)
        var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }


}
1
Ricardo LR

Hier ist eine Möglichkeit, dies ohne Verwendung von Bildern zu tun. Dies ist die einzige Möglichkeit, die bei mir funktioniert hat:

self.navigationController.navigationBar.layer.shadowOpacity = 0;

Leider müssen Sie dies für jede Datei tun, in der die Zeile nicht angezeigt werden soll. Es gibt keine Möglichkeit, dies in appDelegate zu tun.

Bearbeiten:

Das Setzen von shadowColor auf nil ist nicht erforderlich. Dies ist die einzige Zeile, die Sie benötigen.

1
Scott
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
1
Nik Kov

Ziel C Antwort auf die obige Frage

// 1px Zeile der Navigationsleiste entfernen

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
[[UINavigationBar appearance] setTranslucent:NO];
[[UINavigationBar appearance] setTintColor:[UIColor yourColor]];
1
Vaibhav Gaikwad

In Swift machen wir das so

Für jeden View Controller:

navigationBar.shadowImage = UIImage()
setBackgroundImage(UIImage(), for: .default)

Für eine ganze App:

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

Ich bin auf dasselbe Problem gestoßen und keine der Antworten war wirklich zufriedenstellend. Hier ist meine Einstellung zu Swift3:

func hideNavigationBarLine() {
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
}

Rufen Sie dies einfach in viewDidLoad () auf.

1
easytarget

Hallo, das funktioniert für Swift 4.

    override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController?.navigationBar.isTranslucent = false
}

sie müssen dies in viewDidLayoutSubviews anstelle von viewDidLoad einfügen

0
Kelvin Fok

Hier ist eine weitere Option - ich denke, dies funktioniert nur, wenn Sie keine Transluzenz für Ihre Navigationsleiste benötigen (ich habe es nicht getan). Ich habe gerade ein 1 Pixel hohes UIView am unteren Rand der Navigationsleiste (1 Pixel unterhalb der Navigationsleiste) mit der gleichen Farbe wie meine Navigationsleiste hinzugefügt:

UIView *view = [[UIView alloc] init];
[view setBackgroundColor:self.navigationController.navigationBar.barTintColor];
[self.navigationController.navigationBar addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(1.0f));
    make.leading.trailing.equalTo(self.navigationController.navigationBar);
    make.bottom.equalTo(self.navigationController.navigationBar).offset(1.0f);
}];

Ich füge die Einschränkungen mit Masonry hinzu.

0
jwswart
[tabviewController.view setBackgroundColor:[UIColor blackColor]];

Hat es für mich [UIColor blackColor] könnte Ihre Hintergrundfarbe sein, und tabviewController ist Ihr UITabBarController, wenn Sie es verwenden!

0
Jeffrey Snijder

Bar Style Black hat es für mich getan.

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

Alle Eigenschaften, die ich habe (nur für den Fall):

    [[UINavigationBar appearance] setBarTintColor:color];
    [[UINavigationBar appearance] setTranslucent:NO];
    [[UINavigationBar appearance] setShadowImage:[UIImage new]];
    [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
0
user1122069

Eine nette kurze Swift Funktion, um den Haaransatz in den Unteransichten zu finden, ist diese:

 func findHairLineInImageViewUnder(view view: UIView) -> UIImageView? {
    if let hairLineView = view as? UIImageView where hairLineView.bounds.size.height <= 1.0 {
        return hairLineView
    }

    if let hairLineView = view.subviews.flatMap({self.findHairLineInImageViewUnder(view: $0)}).first {
      return hairLineView
    }

    return nil
}
0
Marijn

Für mich hat es am einfachsten funktioniert, ein PNG mit der erforderlichen Farbe zu erstellen (es muss nur ein Pixel für ein Pixel groß sein) und dann die Werte für backgroundImage und shadowImage so festzulegen:

let greenPixel = UIImage(named: "TheNameOfYourPng")
navigationBar.setBackgroundImage(greenPixel, forBarMetrics: UIBarMetrics.Default)
navigationBar.shadowImage = greenPixel
0
Gruntcakes

Zwei-Linien-Lösung, die für mich funktioniert. Versuchen Sie, dies in die ViewDidLoad-Methode einzufügen:

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

Mein Ansatz:

UINavigationBar.appearance().setBackgroundImage(
            UIImage(),
            forBarPosition: .Any,
            barMetrics: .Default)
    var _width:CGFloat! = self.navigationController?.navigationBar.layer.frame.width
            var _height:CGFloat! = self.navigationController?.navigationBar.layer.frame.height
            var navBarBg = UIView(frame:CGRectMake(0, 0, _width, _height))
            //solid color for bg
            navBarBg.backgroundColor = UIColor.orangeColor()
            view.addSubview(navBarBg)
0
Maysam

In Xamarin Forms hat das bei mir funktioniert. Fügen Sie dies einfach auf AppDelegate.cs hinzu:

UINavigationBar.Appearance.ShadowImage = new UIImage();
0
Kelson Pereira

Das hört sich vielleicht blöd an, aber dieser Haaransatz wird nur angezeigt, wenn die Hintergrundfarbe für die Ansicht von viewController auf eine andere Farbe als Weiß eingestellt ist. Ich war schockiert, diese Tatsache zu erfahren.

Wenn Sie also möchten, dass es ohne großen Aufwand verschwindet, setzen Sie einfach die Hintergrundfarbe der Controller-Ansicht auf WEISS.

0
Pavel Gurov