Es posible cambiar el gris de la frontera-parte inferior de color de la UINavigationBar en iOS7?

Ya he probado a quitar a la frontera, pero esto no está funcionando:

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

Gracias!

InformationsquelleAutor MappleDev | 2013-09-30

15 Comentarios

  1. -10

    Esto te ayude 🙂

    [self.navigationController.navigationBar.layer setBorderWidth:2.0];//Just to make sure its working
    [self.navigationController.navigationBar.layer setBorderColor:[[UIColor redColor] CGColor]];
    
    • Este es un borde alrededor de toda la UINavigation bar, que no es la frontera de autor está tratando de cambiar. Esto no ayuda, al intentar establecer el borde inferior.
  2. 62

    Va a quitar la sombra, pero no de la frontera, usted necesita hacer lo siguiente:

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

    A cambio de la frontera utilizar una imagen de 2 píxeles de ancho de línea:

    [[UINavigationBar appearance] setShadowImage:[UIImage imageNamed:@"2pxWidthLineImage"]]; 
    
    • Y ¿cómo puedo agregar un borde? (cambio de color)
    • Esto debe ser aceptado respuesta.
    • Este método elimina la naturaleza translúcida de la barra de navegación.
    • setShadowImage parece que no existe.
  3. 55

    Aquí es una categoría para cambiar el fondo de color con la altura:

    [self.navigationController.navigationBar setBottomBorderColor:[UIColor redColor] height:1];
    

    iOS7 - Cambio UINavigationBar color de borde

    Objetivo C:

    UINavigationBar+Ayudante.h

    #import <UIKit/UIKit.h>
    
    @interface UINavigationBar (Helper)
    - (void)setBottomBorderColor:(UIColor *)color height:(CGFloat)height;
    @end
    

    UINavigationBar+Ayudante.m

    #import "UINavigationBar+Helper.h"
    
    @implementation UINavigationBar (Helper)
    
    - (void)setBottomBorderColor:(UIColor *)color height:(CGFloat)height {
        CGRect bottomBorderRect = CGRectMake(0, CGRectGetHeight(self.frame), CGRectGetWidth(self.frame), height);
        UIView *bottomBorder = [[UIView alloc] initWithFrame:bottomBorderRect];
        [bottomBorder setBackgroundColor:color];
        [self addSubview:bottomBorder];
    }
    @end
    

    Swift:

    extension UINavigationBar {
    
        func setBottomBorderColor(color: UIColor, height: CGFloat) {
            let bottomBorderRect = CGRect(x: 0, y: frame.height, width: frame.width, height: height)
            let bottomBorderView = UIView(frame: bottomBorderRect)
            bottomBorderView.backgroundColor = color
            addSubview(bottomBorderView)
        }
    }
    
    • Impresionante respuesta. Mi interfaz de usuario está mirando mucho mejor ahora 🙂
    • Cómo iba yo a escribir esto en Swift?
    • Impresionante hombre … muchas gracias
    • no responde. error en la rotación.
    • Creo que se debe llamar a este método después de la rotación es completa, va a volver a dibujar la subViews. o simplemente recargar subViews.
    • En lugar de utilizar un CGRect para cambiar el tamaño del borde de la vista, usted puede agregar las restricciones en cuanto al tamaño con rotación y cambios de rasgos.
    • Necesidad de establecer autoresizing máscaras en la frontera de la vista.

  4. 9

    Aquí es de otra manera:

    CALayer *border = [CALayer layer];
    border.borderColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"border"]].CGColor;
    border.borderWidth = 1;
    CALayer *layer = self.navigationController.navigationBar.layer;
    border.frame = CGRectMake(0, layer.bounds.size.height, layer.bounds.size.width, 1);
    [layer addSublayer:border];
    
  5. 6

    La única manera que he encontrado para el cambio de color es:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        if let navigationController = self.navigationController {
            let navigationBar = navigationController.navigationBar
            let navigationSeparator = UIView(frame: CGRectMake(0, navigationBar.frame.size.height - 1, navigationBar.frame.size.width, 0.5))
            navigationSeparator.backgroundColor = UIColor.redColor() //Here your custom color
            navigationSeparator.opaque = true
            self.navigationController?.navigationBar.addSubview(navigationSeparator)
        }
    
    }
    
    • Brillante. Funciona como un encanto.
  6. 5

    Escribí una extensión basada en las otras respuestas para facilitar su uso en Swift:

    extension UINavigationBar {
    
        func setBottomBorderColor(color: UIColor) {
    
            let navigationSeparator = UIView(frame: CGRectMake(0, self.frame.size.height - 0.5, self.frame.size.width, 0.5))
            navigationSeparator.backgroundColor = color
            navigationSeparator.opaque = true
            navigationSeparator.tag = 123
            if let oldView = self.viewWithTag(123) {
                oldView.removeFromSuperview()
            }
            self.addSubview(navigationSeparator)
    
        }
    }
    

    Puede utilizar esta extensión con la llamada al método en un contexto como el que:

    self.navigationController?.navigationBar.setBottomBorderColor(UIColor.whiteColor())
    

    He encontrado que es bastante útil ya que yo tenía que lidiar con el color de la frontera-problema.

  7. 5

    He resuelto este problema con el uso de autodiseños. La solución trabaja en diferentes tamaños de pantalla y con el cambio de orientación.

    extension UINavigationBar {
    
        @IBInspectable var bottomBorderColor: UIColor {
            get {
                return self.bottomBorderColor;
            }
            set {
                let bottomBorderRect = CGRect.zero;
                let bottomBorderView = UIView(frame: bottomBorderRect);
                bottomBorderView.backgroundColor = newValue;
                addSubview(bottomBorderView);
    
                bottomBorderView.translatesAutoresizingMaskIntoConstraints = false;
    
                self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1, constant: 0));
                self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1, constant: 0));
                self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1, constant: 0));
                self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute,multiplier: 1, constant: 1));
            }
    
        }
    
    }
    
    • funciona muy bien, y es inspectable que es bueno con los storyboards! Gracias!
    • Gran trabajo! Gracias
  8. 4

    Basado en la respuesta de @faja hice una extensión en el uso de Swift Automático, explicó aquí.

    En esencia, las otras soluciones tiene las siguientes dificultades:

    • Puede agregar sombra si el uso de la UIImage solución
    • La subvista añadido de no cambiar el tamaño a la rotación de la vista
    extensión UINavigationBar { 
    
    func setBottomBorderColor(color: UIColor, altura: CGFloat) -> UIView { 
    
    vamos a bottomBorderView = UIView(marco: CGRectZero) 
    bottomBorderView.translatesAutoresizingMaskIntoConstraints = false 
    bottomBorderView.backgroundColor = color 
    
    auto.addSubview(bottomBorderView) 
    
    deje que las vistas = ["frontera": bottomBorderView] 
    auto.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[frontera]|", opciones: [], métricas: nil, vistas: las vistas)) 
    auto.addConstraint(NSLayoutConstraint(elemento: bottomBorderView, atributo: .Altura, relatedBy: .Igual, toItem: nil, atributo: .NotAnAttribute, multiplicador: 1.0, constante: la altura)) 
    auto.addConstraint(NSLayoutConstraint(elemento: bottomBorderView, atributo: .Parte inferior, relatedBy: .Igual, toItem: auto, atributo: .Parte inferior, multiplicador: 1.0, constante: la altura)) 
    
    volver bottomBorderView 
    } 
    } 
    

    Esto permitirá agregar una gota de sombra si es necesario, y se encarga de rotación muy bien !

    • Esto funciona muy bien, gracias. No creo que usted necesita devolver un UIView, aunque. Funciona sin un valor de retorno.
  9. 2

    Si te gusta simple y chapucero soluciones, al igual que yo, cree una vista que cubre el borde predeterminado:

    UIView *navBarLineView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetHeight(self.navigationController.navigationBar.frame),
                                                                      CGRectGetWidth(self.navigationController.navigationBar.frame), 1)];
    navBarLineView.backgroundColor = [UIColor redColor];
    [self.navigationController.navigationBar addSubview:navBarLineView];
    
  10. 1

    Bien, si desea quitar el borde inferior de establecer imagen de la sombra a la imagen vacía

    [navigationBar setShadowImage:[UIImage new]];
    

    así que si quieres ponerlo de otro color, acaba de crear una imagen con ese color, yo uso una función de ayuda para crear la imagen de color a continuación (fuente original http://jslim.net/blog/2014/05/05/ios-customize-uitabbar-appearance/)

    + (UIImage *)imageFromColor:(UIColor *)color forSize:(CGSize)size 
    {
    return [UIImage imageFromColor:color forSize:size withCornerRadius:0];
    }
    
    + (UIImage *)imageFromColor:(UIColor *)color forSize:(CGSize)size     withCornerRadius:(CGFloat)radius
    {
    CGRect rect = CGRectMake(0, 0, size.width, size.height);
    UIGraphicsBeginImageContext(rect.size);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //Begin a new image that will be the new image with the rounded corners
    //(here with the size of an UIImageView)
    UIGraphicsBeginImageContext(size);
    
    //Add a clip before drawing anything, in the shape of an rounded rect
    [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius] addClip];
    //Draw your image
    [image drawInRect:rect];
    
    //Get the image, here setting the UIImageView image
    image = UIGraphicsGetImageFromCurrentImageContext();
    
    //Lets forget about that we were drawing
    UIGraphicsEndImageContext();
    
    return image;
    }
    

    y en mi navbar

    [navigationBar setShadowImage:[UIImage imageFromColor:[UIColor redColor] forSize:CGSizeMake(CGRectGetWidth(self.tableView.frame), 1)]];
    

    que es, que Es trabajo para mí, espero que esta ayuda. Por favor, considere la posibilidad de cambiar la aceptó contestar porque no su trabajo y puede ser confuso

  11. 1

    budidino soluciones funciona muy bien. Aquí es para Swift:

    let navBarLineView = UIView(frame: CGRectMake(0,
        CGRectGetHeight((navigationController?.navigationBar.frame)!),
        CGRectGetWidth((self.navigationController?.navigationBar.frame)!),
        1))
    
    navBarLineView.backgroundColor = UIColor.whiteColor()
    
    navigationController?.navigationBar.addSubview(navBarLineView)
    
  12. 1

    A construir en @faja de la rápida aplicación puede hacer que la frontera sensible a la rotación/cambios de rasgos mediante restricciones:

    extension UINavigationBar {
      func setBottomBorderColor(color: UIColor, height: CGFloat) {
    
        let bottomBorderView = UIView()
        bottomBorderView.backgroundColor = color
        bottomBorderView.translatesAutoresizingMaskIntoConstraints = false
        addSubview(bottomBorderView)
    
        //Add constraints to make the bar always stay at the bottom of the nav bar and change size with rotation/trait changes
        let horizontalConstraint = NSLayoutConstraint(item: bottomBorderView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: self, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0)
        let verticalConstraint = NSLayoutConstraint(item: bottomBorderView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: self, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0)
        let widthConstraint = NSLayoutConstraint(item: bottomBorderView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: self, attribute: .width, multiplier: 1, constant: 0)
        let heightConstraint = NSLayoutConstraint(item: bottomBorderView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: height)
    
        self.addConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
      }
    }
    
  13. 0

    Aquí está el método para crear la imagen con el color claro:

    + (UIImage*)imageFromColor:(UIColor *)color withSize:(CGSize)sizeImage
    {
        UIImage *resultImage = nil;
    
        UIGraphicsBeginImageContext(sizeImage);
    
        CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor);
        CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0.0f, 0.0f, sizeImage.width, sizeImage.height));
        resultImage = UIGraphicsGetImageFromCurrentImageContext();
    
        UIGraphicsEndImageContext();
    
        return resultImage;
    }
    

    Aquí es de uso para la eliminación de los molestos línea de base:

    navigationBar.shadowImage = [UIImage imageFromColor:[UIColor clearColor] withSize:CGSizeMake(1.0f, 1.0f)];
    
  14. 0

    Imagen 1

    puede utilizar Revelar para ver el color del borde es el UIImageView del fondo.
    para modificar directamente el imageView del fondo o se esconden.

    el código: yo escribo en @interfaz QdtTabBarController : UITabBarController

    Class backGroundClass = NSClassFromString(@"_UIBarBackground");
    for (UIView *view in self.tabBar.subviews) {
        if ([view isKindOfClass:backGroundClass]) {
            for (UIView *view2 in view.subviews) {
                if ([view2 isKindOfClass:[UIImageView class]]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        view2.backgroundColor = [UIColor redColor];
                    });
                };
            };
            break;
        }
    }
    

    Imagen 2

  15. -1

    Estoy usando RubyMotion con el RedPotion gema, que incluye un StandardAppearance clase. Esto es lo que hice!

    Poner esta línea en la parte superior de su app_delegate.rb, justo antes de la on_load método:

    ApplicationStylesheet.new(nil).application_setup
    

    Luego, en su application_stylesheet.rb, poner esto como la última línea en el application_setup método:

    StandardAppearance.apply app.window
    

    Y, a continuación, este es mi StandardAppearance clase:

    class StandardAppearance
      def self.apply(window)
        Dispatch.once do
    
          UINavigationBar.appearance.tap do |o|
            o.setBackgroundImage(UIImage.alloc.init, forBarMetrics: UIBarMetricsDefault)
            o.shadowImage = UIImage.alloc.init
          end
    
        end
      end
    end
    
    • ¿Por qué esto de bajar votado? Por favor alguien puede explicar?! Yo estaba tratando de resolver este problema con RubyMotion y esta fue mi solución. Pensé que seguramente no podía lastimar a incluir aquí.
    • No estoy seguro de que su respuesta sería de ayuda que el cartel aquí. El cartel no es ni siquiera el uso de RubyMotion y/o RedPotion. La presentación de una respuesta irrelevante puede confundir a los lectores que están buscando una solución a una pregunta específica. Sí definitivamente herido en la calidad de esta presentación. Incluso si su respuesta fue correcta, ¿cómo de probable es que el cartel va a cambiar de Objective-C para RubyMotion por el simple hecho de cambiar el color del borde? ? ?application_stylesheet.rb ni siquiera es una cosa que en iOS/Objective-C y Swift.
    • No estoy proponiendo que alguien cambie a RubyMotion para una revisión. Que ni siquiera sería posible. Pero cuando se trata de desarrollo de iOS, hay algunos enfoques diferentes: puede utilizar Xcode hacia arriba, puede utilizar Swift, puede utilizar RubyMotion, etc. De hecho, hay una solución allí donde alguien habla de cómo llevarlo a cabo con Swift. ¿A votar en contra de así? Yo estaba pensando si había alguien de la búsqueda para «Cambiar UINavigationBar frontera rubymotion», entonces tal vez podría encontrar mi solución. También, me han ayudado a puestos similares en otras preguntas.
    • Y se puede utilizar JavaScript, C, C++, Esquema…y hay un marco que le permite construir iOS usando Java…. diría usted que la información presentada utilizando los lenguajes/frameworks son aceptables aquí? No, yo no votar en contra de la presentación mediante el uso de Swift porque es uno de los soportados oficialmente lenguaje para desarrollo en iOS y es bastante fácil convertir Swift Obj-C (viceversa). Me refiero a buscar en el Apple docs…. usted puede elegir ver los ejemplos de código mediante el uso de Swift o de Obj-C. no veo Ruby como una de las opciones.
    • Ok. Justo lo suficiente. Me ha sido muy útil para mí en el pasado cuando la gente publicado sus RubyMotion soluciones a iOS problemas, así que creo que voy a aceptar el voto. Es interesante, sin embargo, porque usted viene desde el enfoque que mi respuesta no ayuda a la persona que envió la pregunta original, lo cual es correcto. Yo no estaba tratando de ayudar a esa persona, claramente, teniendo en cuenta que estaba proporcionando una posible solución para el problema de casi 2.5 años más tarde! De nuevo, yo sólo estaba tratando de agregar un poco de google jugo para que mis compañeros de RubyMotion los desarrolladores.
    • Acabo de notar que uno de mis otros ejemplos de este (dando una posible RubyMotion respuesta a una pregunta) sólo se levantó-votaron por aquí: stackoverflow.com/questions/813068/…. Así, no todo está mal, ¿verdad? 😉

Dejar respuesta

Please enter your comment!
Please enter your name here