¿Cómo se establece una image de sombra opaca de 1px para un UINavigationBar?

En la function didFinishLaunchingWithOptions del delegado de mi aplicación, bash personalizar la apariencia de mi barra de navigation.

[UINavigationBar appearance].translucent = NO; [[UINavigationBar appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor] size:CGSizeMake(1.0f, 1.0f) ] forBarMetrics:UIBarMetricsDefault ]; [UINavigationBar appearance].shadowImage = [UIImage imageWithColor:[UIColor networkingColor] size:CGSizeMake(0.5f, 0.5f) ]; 

Espero una sombra roja opaca de 1px de alto. En cambio, me dan una sombra roja translúcida de 2 px de alto. ¿Cómo hacer que aparezca exactamente como yo quiero? He hecho las configuraciones de apariencia análogas a UITabBar. Por otro lado, se comporta bien.

introduzca la descripción de la imagen aquí

La function de categoría que crea imágenes dinámicas se define así:

 + (UIImage*)imageWithColor:(UIColor *)color size:(CGSize)size { CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

Necesita crear un context gráfico retina:

 let pixelScale = UIGraphicsBeginImageContextWithOptions(fillRect.size, false, UIScreen.main.scale) 

Después de eso, tu image de sombra se convertirá en 1 píxel físico alto.

Aquí hay un código completo:

 extension UIImage { static func imageWithColor(color: UIColor) -> UIImage { let pixelScale = UIScreen.main.scale let pixelSize = 1 / pixelScale let fillSize = CGSize(width: pixelSize, height: pixelSize) let fillRect = CGRect(origin: CGPoint.zero, size: fillSize) UIGraphicsBeginImageContextWithOptions(fillRect.size, false, pixelScale) let graphicsContext = UIGraphicsGetCurrentContext() CGContextSetFillColorWithColor(graphicsContext, color.CGColor) CGContextFillRect(graphicsContext, fillRect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } } 

En GitHub:

https://github.com/salutis/swift-image-with-color

Uh … ¿esto es lo que quieres?

captura de pantalla

En mi controller de vista, simplemente agregué una vista UIV con una altura de 1 píxel y un desplazamiento de 44 píxeles:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = [UIColor whiteColor]; [self setupNavBar]; } -(void)setupNavBar { self.navigationItem.title = @"Contacts"; CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame]; UIView *bar = [[UIView alloc] initWithFrame:CGRectMake(0, 44, applicationFrame.size.width, 1.0)]; bar.backgroundColor = [UIColor networkingColor]; [self.navigationController.navigationBar addSubview:bar]; } 

Puedes cambiar el color a lo que quieras.