So verbergen Sie UINavigationBar 1px unter dem Strich

442

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 die Farbe ändert?

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

Geben Sie hier die Bildbeschreibung ein

Szymon Kuczur
quelle
Überprüfen Sie dies: stackoverflow.com/questions/19101361/…
Kuldeep
Wie kann ich die Navigationshöhe um 1 Pixel erhöhen?
Suresh Durishetti

Antworten:

738

Für iOS 13:

Verwenden Sie die .shadowColorEigenschaft

Wenn diese Eigenschaft Null ist oder die klare Farbe enthält, zeigt der Balken keinen Schatten an

Zum Beispiel:

let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence

Für iOS 12 und niedriger:

Dazu sollten Sie ein benutzerdefiniertes Schattenbild festlegen. Damit das Schattenbild angezeigt wird, müssen Sie jedoch auch ein benutzerdefiniertes Hintergrundbild festlegen. Zitat aus der Apple-Dokumentation:

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, es zu verstecken. Leider wird die Transluzenz von Bar entfernt.

Ich möchte 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, mit Farbe gefülltes Hintergrundbild und verwenden Sie es.

  3. Verwenden Sie die unten beschriebene 'hacky'-Methode. Es wird auch Balken durchscheinend halten.

Wie hält man den Balken durchscheinend?

Um die Transluzenz zu erhalten, benötigen Sie einen anderen Ansatz. Es sieht aus wie ein Hack, funktioniert aber gut. Der Schatten, den wir entfernen wollen, ist UIImageViewirgendwo darunter ein Haaransatz UINavigationBar. Wir können es finden und bei Bedarf verstecken / zeigen.

In den folgenden Anweisungen wird davon ausgegangen, dass der Haaransatz nur in einem Controller Ihrer UINavigationControllerHierarchie versteckt sein muss .

  1. Instanzvariable deklarieren:

    private var shadowImageView: UIImageView?
  2. Methode hinzufügen, die diesen Schatten findet (Haaransatz) 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/viewWillDisappearMethoden 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 den UISearchBarHaaransatz funktionieren und (fast) alles andere, was Sie verstecken müssen :)

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

Serhii Yakovenko
quelle
103
Sie können auch einfach die Ansicht der UINavigationBarEigenschaft clipsToBounds = YES
einstellen
3
@richarddas clipsToBounds = YESwirkt wie ein Zauber! Vielen Dank!
Romeouald
3
Die clipsToBounds funktionieren bei einigen Layouts nicht immer. Diese Antwort hat bei mir perfekt funktioniert. Nur ich habe eine UINavigationBar-Unterklasse erstellt und den obigen Code verwendet, um das Schattenbild in den Methoden -layoutSubview auszublenden. Vielen Dank!
Cgossain
7
Ich habe nur ein Problem damit, dass meine obere iOS-Statusleiste durchscheinend wird und ich meine Tabellenansicht hinter der UINavigationBar scrollen sehen kann. Ich habe dies behoben, indem ich setTranslucent = NO gesetzt habe.
Vlad
2
In iOS 10 scheint es, dass, wenn viewWillAppear aufgerufen wird, wir nicht bekommen könnenshadowImageView
xi.lin
240

Unten kann einfach helfen!

Schnell:

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

Ziel c:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
Vishnuvardhan
quelle
6
Ich bin auf Xcode 8 und Entwickler für> iOS 8 und keiner der oben genannten hat für mich funktioniert, außer diesem.
Vakas
2
Auch unter XCode 8 und> iOS 8. Dies ist die einzige Antwort, die bei mir funktioniert hat.
Cloudcal
1
Dies ist die einzige kurze und einfache Antwort, die für mich für iOS 10 und Xcode 8.3.1 funktioniert hat. Danke, Mann.
Vishal Sonawane
1
Ziel-C: self.navigationController.navigationBar.shadowImage = [UIImage new];
Marcelo dos Santos
1
Nur das funktioniert bei mir in iOS 13.3.1 Version iPad.
Ravi
145

Wenn Sie nur eine feste Navigationsleistenfarbe verwenden möchten und diese in Ihrem Storyboard eingerichtet haben, verwenden Sie diesen Code in Ihrer AppDelegateKlasse, 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]];
Rick Pastoor
quelle
2
Dies setzt es global für JEDE Navigationsleiste in Ihrer Codebasis ... meistens nicht das, was Sie wollen.
Christoph
97

Versuche dies:

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

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

Das folgende Bild enthält die Erklärung (iOS7 NavigationBar):

Geben Sie hier die Bildbeschreibung ein

Überprüfen Sie diese SO-Frage: iOS7 - Ändern Sie die Rahmenfarbe der UINavigationBar

Tarek Hallak
quelle
Wie Serhii sagte, muss ein benutzerdefiniertes Hintergrundbild festgelegt werden, damit das Schattenbild akzeptiert wird.
Akashivskyy
3
Tun Sie dies in Ihrem AppDelegate.
Myusuf3
Tolle Antwort ... hat meinen Tag gerettet _ / \ _
Akshay
@RPM Funktioniert hervorragend in iOS 7,8,9,10. Für Swift gibt es denselben Code für die Navigationsleiste von viewControlles in Medium .
Akhrameev
64

Wollte die Swift-Version von Serhiis Antwort hinzufügen. Ich habe eine UIBarExtension.swiftmit folgendem 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
    }
}
pxpgraphics
quelle
Vielen Dank! Dieser sollte die Antwort sein.
PeiweiChen
Es funktioniert mit der Navigationsleiste, aber nicht mit der Uitoolbar
TomSawyer
Ich stelle fest, dass dies mit iOS 12 nicht mehr funktioniert. :(.
Chris Prince
Funktioniert
super
Dieser sollte die Antwort sein. funktioniert wie Charme in ios 13
COVID19
63

Der schnelle Weg, es zu tun:

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

UINavigationBar.appearance().shadowImage = UIImage()
OscarVGG
quelle
2
Es ist ziemlich selten, dass man so weit unten auf der Liste steht, bevor man die eleganteste Antwort findet. +1!
Sudo Make Install
3
Es verbirgt den gesamten Hintergrund der UINavigationBar tho: /
user365314
Falsch, es verbirgt auch den ganzen Hintergrund!
TomSawyer
3
Hinweis: Sie müssen die isTranslucent der Navigationsleiste auf false setzen
dmathewwws
19

Einfache Lösung in kurzer Zeit

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
Jakub Průša
quelle
3
+1 Von allen Antworten hat dies schließlich für mich funktioniert. Die Statusleiste wurde nicht als andere Antwort durcheinander gebracht, und es wurde das Problem behoben, dass nur eine der Navigationssteuerungsleisten geändert wurde, nicht alle Navigationsleisten im Projekt.
JoeGalind
Swift 4.2 Version: navigationBar? .SetBackgroundImage (UIImage (), für: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe
16

Nachdem ich die Antwort von Serhil studiert hatte, erstellte ich einen Pod UINavigationBar + Addition , der den Haaransatz leicht verbergen kann.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

In Swift 3.0

Bearbeiten Sie Ihre, AppDelegate.swiftindem 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)
smohn
quelle
16

Ab iOS 13 gibt es eine System-API zum Festlegen 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 Eigenschaft shadowColor 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

https://developer.apple.com/documentation/uikit/uibarappearance/3198009-shadowimage

Glotcha
quelle
shadowImage und shadowColor sind nicht in UINavigationBarAppearanceHeadern dokumentiert !! Ich würde es nie finden. Danke, das hat meine Probleme zu 100% gelöst
Roger Oba
1
Ja, es funktioniert auch für mich in iOS 13 gut. Vielen Dank @glotcha.
Yogesh Patel
@glotcha Richtig ....
Digvijay
Vielen Dank. Das einzige, was für mich funktioniert hat
Alionthego
13

Kann auch vor Storyboard ausgeblendet werden (Arbeiten an Xcode 10.1)

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

Geben Sie hier die Bildbeschreibung ein

Gagandeep Gambhir
quelle
11

Die Lösung von pxpgraphics wurde für Swift 2.0 aktualisiert

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
    }

}
tf.alves
quelle
Hallo, neu bei iOS und versuche mich selbst zu unterrichten. Wie verwende ich die Erweiterung? Ich habe eine View-Controller-Datei und habe diese Erweiterungen außerhalb des Klassenbereichs eingefügt. Aber wie rufe ich dann hide / showHairline () auf? Ich verstehe nicht wirklich, wie man Erweiterungen verwendet, aber es wird für so viele Lösungen verwendet, aber ich verstehe einfach nicht, wie sie im eigentlichen Code implementiert sind
Tommy K
Die Erweiterungen erweitern Ihre vorhandenen Klassen um Funktionen. Für jede erweiterte Klasse, Struktur, Aufzählung usw. stehen Ihnen diese neuen Funktionen zur Verfügung, wann immer Sie sie benötigen. Weitere
Informationen finden Sie
hm also sollte ich dann einfach UINavigationController().navigationBar/toolbar.hide/showBottomHairline()nein benutzen können ? Ich versuche das, aber ohne Erfolg. Verstehe ich nicht richtig?
Tommy K
11

Swift 4 // zum Ausblenden der Schattenlinie der Navigationsleiste

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

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 in allen Navigationsleisten zu deaktivieren, müssen Sie Folgendes verwenden:

UINavigationBar.appearance().flat = true

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

Navigationsleiste Storyboard

Alvivi
quelle
Bei NunoGonçalves können Sie sich flatAssociatedObjectKeyein eindeutiges int (als Zeiger behandelt) vorstellen, um das zugehörige Objekt zu identifizieren. Hier wird durch die Speicheradresse einer privaten Variable definiert. Ich habe die Antwort aktualisiert, um diese Variable hinzuzufügen. Weitere Informationen finden Sie unter nshipster.com/associated-objects .
Alvivi
Gute Lösung, funktioniert aber nur, wenn die Navigationsleiste translucentauf false gesetzt ist
ZYiOS
9

Swift 4 testete EINE LINIENLÖSUNG

In Viewdidload() Set Navigation Controller ist der Standardwert true für den Schlüssel "hidesShadow".

override func viewDidLoad() {
    super.viewDidLoad()

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

}
Sachin Rasane
quelle
1
Perfekt funktionieren !!
Prashant Tukadiya
7

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
UnRewa
quelle
Und es entfernt auch die Hintergrundfarbe.
TomSawyer
7

Eine weitere Option, wenn Sie die Transluzenz beibehalten und nicht alle UINavigationControllerin Ihrer App unterklassifizieren 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
jhurliman
quelle
6
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()

}
James
quelle
Danke James! Ich kann nicht verstehen, warum jemand Ihre Antwort abgelehnt hat.
Dănuț Mihai Florian
Wenn Sie es benötigen, können Sie auch Folgendes hinzufügen: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false ()
Alessandro Ornano
5

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 auf den ersten Viewcontroller und rufen Sie sie auf viewdidload

Mattk90
quelle
4

In iOS8, wenn Sie die Einstellung UINavigationBar.barStyleauf setzen.Black Sie den Hintergrund der Leiste als unifarben ohne Rand festlegen.

In Swift:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
gpbl
quelle
Dies ist die sauberste Lösung und der beste Weg, dies zu erreichen. Wenn Sie <iOS 8 nicht unterstützen müssen, gibt es keinen Grund, diese Antwort nicht zu verwenden. Vielen Dank.
user3344977
Funktioniert super. Ich habe es auch im Storyboard eingestellt und brauchte nicht einmal Code.
Vikzilla
1
Wenn Sie dies tun, erhalten Sie eine sehr kleine weiße Linie anstelle des Standardschattens.
Vegard
4

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

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true
Evgenii Mokeev
quelle
nur das hat bei mir funktioniert
Usama bin Attique
3

Hier ist eine sehr einfache Lösung:

self.navigationController.navigationBar.clipsToBounds = YES;
user3344977
quelle
37
Der Statusleistenbereich wird ebenfalls abgeschnitten.
Wut
3

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 hinzu zu viewDidLoad():

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

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

UINavigationBar.appearance().shadowImage = UIImage()
Mariano Pardo
quelle
2

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

Leo Natan
quelle
2

Sie sollten eine Ansicht am unteren Rand 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)
Socheat
quelle
Ich kann nicht glauben, dass dies immer noch ein Problem ist - bin einfach wieder darauf gestoßen! Diese Lösung ist derzeit jedoch die bestmögliche. Danke @Socheat
RichAppz
1

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 UINavigationBar-Unterklasse didAddSubview mit dem folgenden Code:

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

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

Ich habe gerade eine Erweiterung dafür erstellt ... Entschuldigung für 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
    }


}
Ricardo LR
quelle
1

In 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()] }

Es ist mir nicht gelungen, auf einem bestimmten VC etwas anderes zu implementieren, aber dies wird 90% der Menschen helfen

David West
quelle
1
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

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