Cómo ocultar el resultado final de UINavigationBar 1px


443

Tengo una aplicación que a veces necesita que su barra de navegación se mezcle con el contenido.

¿Alguien sabe cómo deshacerse o cambiar el color de esta pequeña barra molesta?

En la imagen a continuación la situación que tengo - estoy hablando de esta línea de altura de 1px debajo de "Root View Controller"

ingrese la descripción de la imagen aquí



¿Cómo aumentar 1px de altura de navegación?
Suresh Durishetti

Respuestas:


738

Para iOS 13:

Usa la .shadowColorpropiedad

Si esta propiedad es nula o contiene el color claro, la barra no muestra sombras

Por ejemplo:

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

Para iOS 12 y versiones inferiores:

Para hacer esto, debe establecer una imagen de sombra personalizada. Pero para que se muestre la imagen sombreada, también debe establecer una imagen de fondo personalizada, cite la documentación de Apple:

Para que se muestre una imagen de sombra personalizada, también se debe establecer una imagen de fondo personalizada con el método setBackgroundImage (_: for :). Si se utiliza la imagen de fondo predeterminada, se utilizará la imagen de sombra predeterminada independientemente del valor de esta propiedad.

Entonces:

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

Arriba está la única forma "oficial" de ocultarlo. Desafortunadamente, elimina la translucidez de la barra.

No quiero imagen de fondo, solo color

Tienes esas opciones:

  1. Color sólido, sin translucidez:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
    
  2. Crea una pequeña imagen de fondo llena de color y úsala.

  3. Utilice el método 'hacky' que se describe a continuación. También mantendrá la barra translúcida.

¿Cómo mantener la barra translúcida?

Para mantener la translucidez, necesita otro enfoque, parece un truco pero funciona bien. La sombra que estamos tratando de eliminar es una rayita en UIImageViewalgún lugar debajo UINavigationBar. Podemos encontrarlo y ocultarlo / mostrarlo cuando sea necesario.

Las instrucciones a continuación suponen que necesita una línea oculta solo en un controlador de su UINavigationControllerjerarquía.

  1. Declarar variable de instancia:

    private var shadowImageView: UIImageView?
  2. Agregue un método que encuentre esta sombra (rayita) 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. Agregar / editar viewWillAppear/viewWillDisappearmétodos:

    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
    }
    

El mismo método también debería funcionar para UISearchBarrayita y (casi) cualquier otra cosa que necesite ocultar :)

¡Muchas gracias a @Leo Natan por la idea original!


103
También puede configurar la vista de la UINavigationBarpropiedad:clipsToBounds = YES
cleverbit

3
@richarddas clipsToBounds = YESfunciona como un encanto! ¡Gracias!
romeouald

3
ClipsToBounds no siempre funciona para algunos diseños. Esta respuesta funcionó perfecta para mí. Solo creé una subclase UINavigationBar y usé el código anterior para ocultar la imagen de sombra en los métodos -layoutSubview. ¡Gracias!
cgossain

77
Solo para tener en cuenta que tuve un problema en el que mi barra de estado superior de iOS se volvió translúcida y pude ver mi vista de tabla desplazándose detrás de UINavigationBar. Lo arreglé estableciendo setTranslucent = NO.
Vlad

2
En iOS 10 parece que cuando viewWillAppear se llama no podemos obtenershadowImageView
xi.lin

241

¡A continuación puede ayudar simplemente!

Rápido:

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

C objetivo:

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

66
Estoy en Xcode 8 y desarrollador para> iOS 8 y ninguno de los anteriores funcionó para mí, excepto este.
Vakas

2
También en XCode 8 y> iOS 8. Esta es la única respuesta que funcionó para mí.
cloudcal

1
Esta es la única respuesta corta y simple que funcionó para mí para iOS 10 y Xcode 8.3.1. Gracias hombre.
Vishal Sonawane

1
Objetivo-C: self.navigationController.navigationBar.shadowImage = [UIImage new];
Marcelo dos Santos

1
Solo esto funciona para mí en iOS 13.3.1 Versión iPad.
Ravi

145

Si solo desea usar un color de barra de navegación sólido y lo ha configurado en su guión gráfico, use este código en su AppDelegateclase para eliminar el borde de 1 píxel a través del proxy de apariencia:

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

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

2
Esto lo establece global para CADA barra de navegación en su base de código ... la mayoría de las veces no es lo que desea.
Christoph

97

Prueba esto:

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

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

La imagen de abajo tiene la explicación (iOS7 NavigationBar):

ingrese la descripción de la imagen aquí

Y revise esta pregunta SO: iOS7 - Cambiar el color del borde UINavigationBar


Como dijo Serhii, se debe establecer una imagen de fondo personalizada para que se acepte la imagen de sombra.
akashivskyy

3
haz esto en tu AppDelegate.
myusuf3

Gran respuesta ... Me salvó el día _ / \ _
Akshay

@RPM funciona muy bien en iOS 7,8,9,10. Existe el mismo código para la barra de navegación de viewControlles en medio para Swift.
Akhrameev

64

Quería agregar la versión Swift de la respuesta de Serhii. Creé un UIBarExtension.swiftcon lo siguiente:

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

¡Gracias! Esta debería ser la respuesta.
PeiweiChen

Funciona con navigationBar pero no funciona con uitoolbar
TomSawyer

Estoy descubriendo que con iOS 12 esto ya no funciona. :(.
Chris Prince

Funciona genial iOS 13
ttorbik

Esta debería ser la respuesta. funciona como encanto en ios 13
COVID19

63

La forma rápida de hacerlo:

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

UINavigationBar.appearance().shadowImage = UIImage()

2
Es bastante raro llegar tan lejos en la lista antes de encontrar la respuesta más elegante. +1!
sudo make install

3
Oculta todo el trasfondo de UINavigationBar aunque: /
user365314

¡Incorrecto, también oculta todo el fondo!
TomSawyer

3
Nota: debe configurar la barra de navegación isTranslucent en false
dmathewwws

19

Solución simple en swift

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()

3
+1 De todas las respuestas, esto es lo que finalmente funcionó para mí. No estropeó la barra de estado como otras respuestas, y aborda el problema de cambiar solo una de las barras del controlador de navegación, no todas las barras de navegación en el proyecto.
JoeGalind

Versión Swift 4.2: navigationBar? .SetBackgroundImage (UIImage (), para: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe

16

Después de estudiar la respuesta de Serhil, creé una vaina UINavigationBar + Addition que puede ocultar fácilmente la línea del cabello.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

16

En Swift 3.0

Edite su AppDelegate.swiftagregando el siguiente código a la función de su aplicación:

// Override point for customization after application launch.

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

16

A partir de iOS 13, hay una API del sistema para establecer o eliminar la sombra

UIKit usa shadowImage y la propiedad shadowColor para determinar la apariencia de la sombra. Cuando shadowImage es nil, la barra muestra una sombra predeterminada teñida de acuerdo con el valor en la propiedad shadowColor. Si shadowColor es nulo o contiene el color clearColor, la barra no muestra sombra.

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

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


shadowImage y shadowColor no están documentados en los UINavigationBarAppearanceencabezados !! Nunca lo encontraría. Gracias, esto resolvió mis problemas al 100%
Roger Oba

1
Sí, también funciona bien para mí en iOS 13 muchas gracias @glotcha.
Yogesh Patel

@glotcha Right ....
Digvijay

Gracias. lo único que funcionó para mí
alionthego

13

También se puede ocultar de Storyboard (trabajando en Xcode 10.1)

Al agregar el atributo de tiempo de ejecución: hidesShadow - Boolean - True

ingrese la descripción de la imagen aquí


11

Solución de pxpgraphics actualizada para 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
    }

}

Hola, nuevo en iOS y tratando de enseñarme. ¿Cómo uso la extensión? Tengo un archivo de controlador de vista y coloco estas extensiones fuera del alcance de la clase. Pero entonces, ¿cómo llamo hide / showHairline ()? Realmente no entiendo cómo usar extensiones, pero se usa para tantas soluciones, pero no entiendo cómo se implementan en el código real
Tommy K

Las extensiones agregan funcionalidad a sus clases existentes. Cualquier clase extendida, estructura, enumeración, etc., tendrá estas nuevas funciones disponibles siempre que necesite usarlas. Ver más aquí: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
tf.alves

hm, así que debería poder usar UINavigationController().navigationBar/toolbar.hide/showBottomHairline()entonces ¿no? Estoy intentando esto pero fue en vano. ¿No estoy entendiendo correctamente?
Tommy K

11

Swift 4 // para ocultar la línea de sombra de la barra de navegación

navigationController?.navigationBar.shadowImage = UIImage()

10

Utilizo una extensión UINavigationBar que me permite ocultar / mostrar esa sombra usando la API UIAppearance o seleccionando qué barra de navegación tiene que ocultar / mostrar esa sombra usando Storyboard (o código fuente). Aquí está la extensión:

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)
        }
    }
}

Ahora, para deshabilitar la sombra en todas las barras de navegación, debe usar:

UINavigationBar.appearance().flat = true

O puede habilitar / deshabilitar este comportamiento usando guiones gráficos:

Barra de navegación Storyboard


@ NunoGonçalves, puede pensar flatAssociatedObjectKeycomo un int único (tratado como puntero) para identificar su objeto asociado. Aquí se define por la dirección de memoria de una var privada. Actualicé la respuesta para agregar esta var. Visite nshipster.com/associated-objects para obtener más información.
Alvivi

Buena solución, pero solo funciona cuando la barra de navegación está configurada translucenten falso
ZYiOS

9

Swift 4 probado SOLUCIÓN DE UNA LÍNEA

En Viewdidload() Establecer el valor predeterminado del usuario del controlador de navegación verdadero para la clave "hidesShadow"

override func viewDidLoad() {
    super.viewDidLoad()

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

}

1
¡Funcionando perfectamente!
Prashant Tukadiya

7

Swift puso esto

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

en

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

Y también elimina el color de fondo.
TomSawyer

7

Otra opción si desea preservar la translucidez y no desea subclasificar todos UINavigationControlleren su aplicación:

#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

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()

}

Gracias James! No puedo entender por qué alguien rechazó tu respuesta.
Dănuț Mihai Florian

si lo necesita, también puede agregar: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationController.navigationBar.backolor.blue.backolor. ()
Alessandro Ornano

5

Solución en Swift 4.2:

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

Simplemente ponga esta función en el primer Viewcontroller y llámelo viewdidload


4

En iOS8, si se establece el UINavigationBar.barStyleque .Blackse puede poner el fondo de la barra como el color blanco sin la frontera.

En Swift:

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

Esta es la solución más limpia y la mejor manera de lograr esto. Si no tiene que soportar <iOS 8, no hay razón para no usar esta respuesta. Gracias.
user3344977

Funciona genial. También lo configuré en el guión gráfico, por lo que ni siquiera necesité ningún código.
vikzilla

1
Hacer esto te da una línea blanca muy pequeña en lugar de la sombra estándar.
Vegard

4

Solución de dos líneas que funciona para mí. Intente agregar esto en el método ViewDidLoad:

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

solo esto funcionó para mí
Usama bin Attique

3

Aquí hay una solución muy simple:

self.navigationController.navigationBar.clipsToBounds = YES;

37
El área de la barra de estado también está recortada.
Furia

3

Solución simple - Swift 5

  1. Crea una extensión:

    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. Agregue esto a viewDidLoad():

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

2

Para los usuarios de iOS 9, esto funcionó para mí. solo agrega esto:

UINavigationBar.appearance().shadowImage = UIImage()

2

El problema con la configuración de una imagen de fondo es que elimina el desenfoque. Puede eliminarlo sin establecer una imagen de fondo. Mira mi respuesta aquí .


2

Debe agregar una vista al final de UISearchBar

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)

No puedo creer que esto siga siendo un problema, ¡solo lo volví a encontrar! Pero esta solución es la mejor posible en este momento; Gracias @Socheat
RichAppz

1

Sé que este es un hilo viejo, pero encontré una solución que funciona muy bien:

Subclase UINavigationBar. En su subclase UINavigationBar, anule didAddSubview con el siguiente código:

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

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

1

Acabo de crear una extensión para esto ... Perdón por el formato (esta es mi primera respuesta).

Uso:

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

Extensión:

 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

Dentro de AppDelegate , esto ha cambiado globalmente el formato de NavBar:

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

No he logrado implementar nada diferente en un VC específico, pero esto ayudará al 90% de las personas


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

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.