519 votes

Comment masquer iOS7 UINavigationBar 1px ligne de fond

J'ai une application qui a besoin parfois de sa barre de navigation pour se fondre dans le contenu.

Personne ne sait comment se débarrasser de ou pour changer la couleur de ce peu ennuyeux bar?

Sur l'image ci-dessous situation, j'ai parle de cela 1px de hauteur de la ligne en dessous de "Racine-Vue-Contrôleur"

enter image description here

869voto

Serhii Yakovenko Points 2206

Pour ce faire, vous devez définir une coutume image de l'ombre. Mais pour l'image de l'ombre pour être montré, vous devez également définir une image de fond personnalisée, devis à partir de la documentation d'Apple:

Pour une mesure image de l'ombre pour être montré, image de fond personnalisée doit également être configuré avec le setBackgroundImage:forBarMetrics: la méthode. Si l' arrière-plan par défaut l'image est utilisée, par défaut, à l'ombre de l'image sera être utilisé indépendamment de la valeur de cette propriété.

Donc le code est:

UINavigationBar *navigationBar = self.navigationController.navigationBar;

[navigationBar setBackgroundImage:[UIImage imageNamed:@"NavigationBarBackground"]
                   forBarPosition:UIBarPositionAny
                       barMetrics:UIBarMetricsDefault];

[navigationBar setShadowImage:[UIImage new]];

Ce code suppose que vous voulez que l'image nommée "NavigationBarBackground" comme fond de la barre. Si ce n'est pas le cas, vous pouvez rendre le fond d'une couleur unie en définissant backgroundImage de [UIImage new] et en attribuant navigationBar.backgroundColor à la couleur que vous aimez.

Ci-dessus est le seul "officiel" de façon à le cacher. Mais malheureusement, il supprime la barre de translucidité.

Comment garder la barre translucide?

Pour garder la translucidité vous avez besoin d'une autre approche, il ressemble à un hack, mais fonctionne bien. La racine des cheveux, nous essayons de supprimer est - UIImageView quelque part en UINavigationBar. Nous avons donc de le trouver et de l'afficher ou la masquer en cas de besoin.

La première déclarer la variable d'instance:

@implementation MyViewController {
    UIImageView *navBarHairlineImageView;
}

Puis, en viewDidLoad faire:

navBarHairlineImageView = [self findHairlineImageViewUnder:navigationBar];

Méthode qui trouve l'affichage de l'image dont nous avons besoin:

- (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;
}

Et cela va faire le reste de la magie:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    navBarHairlineImageView.hidden = YES;
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    navBarHairlineImageView.hidden = NO;
}

Même méthode de travail pour l' UISearchBar racine des cheveux.

Merci beaucoup @Leo Natan pour l'idée originale!

P. S. Si vous masquer cette ligne pour mettre de la vue en dessous de la barre de navigation, vous pouvez le rendre translucide trop, alors il sera flou parfaitement avec la barre de navigation. Voir iOS-blur par exemple (non officiel encore) de le faire.

147voto

Rick Pastoor Points 1065

Si vous voulez juste utiliser une solide barre de navigation de couleur et ont mis cela dans votre scénario, utilisez ce code dans votre AppDelegate de la classe d'enlever la bande de 1 pixel par l'apparition de proxy:

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

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

105voto

null Points 11407

Essayez ceci:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

L'image ci-dessous a l'explication (iOS7 NavigationBar):

enter image description here

Et vérifier cela DONC, la question: iOS7 - Changement UINavigationBar couleur de la bordure

65voto

pxpgraphics Points 136

Voulais ajouter la Swift version de Serhii de réponse. J'ai créé un UIBarExtension.swift avec les éléments suivants:

import Foundation
import UIKit

extension UINavigationBar {

    func hideBottomHairline() {
        let navigationBarImageView = hairlineImageViewInNavigationBar(self)
        navigationBarImageView!.hidden = true
    }

    func showBottomHairline() {
        let navigationBarImageView = hairlineImageViewInNavigationBar(self)
        navigationBarImageView!.hidden = false
    }

    private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView? {
        if view.isKindOfClass(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(subview)? {
                return imageView
            }
        }

        return nil
    }

}

extension UIToolbar {

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

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

    private func hairlineImageViewInToolbar(view: UIView) -> UIImageView? {
        if view.isKindOfClass(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(subview)? {
                return imageView
            }
        }

        return nil
    }

}

15voto

samwize Points 4144

Après avoir étudié la réponse de Serhil, j'ai créé un pod UINavigationBar+Ajout qui peut facilement se cacher dans les cheveux.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X