iOS 8 NavigationBar BackgroundImage

Con iOS 8, el concepto de solo los tamaños de iPhone y iPad, junto con el retrato y el paisaje, han cambiado y, por lo tanto, configurar la image de background de las barras de navigation no funciona de la misma manera. Actualmente estoy usando el siguiente código:

UIImage *NavigationPortraitBackground = [[UIImage imageNamed:@"nav-image-portrait"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; UIImage *NavigationLandscapeBackground = [[UIImage imageNamed:@"nav-image-landscape"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; [[UINavigationBar appearance] setBackgroundImage:NavigationPortraitBackground forBarMetrics:UIBarMetricsDefault]; [[UINavigationBar appearance] setBackgroundImage:NavigationLandscapeBackground forBarMetrics:UIBarMetricsCompact]; 

La porción de métrica de la barra ha quedado en desuso a partir de iOS 8. Al iniciar mi aplicación, simplemente repite la image de la barra horizontalmente cuando está en un iPhone 6 o 6 Plus. He mirado en las imágenes de las rodajas, pero no creo que esa sea la solución tampoco.

retratopaisaje

Encontré la solución. Necesitaba utilizar el método resizableImageWithCapInsets: resizingMode: y establecía el resizingMode en UIImageResizingModeStretch, de lo contrario, la image seguiría apareciendo en la barra de navigation.

C objective:

 [[UIImage imageNamed:@"nav-image-portrait"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch]; 

Swift 3/4:

 UINavigationBar.appearance().setBackgroundImage(UIImage(named: "image")!.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch), for: .default) 
 [[UINavigationBar appearance] setBackgroundImage:[[UIImage imageNamed:@"navbarimg.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)] forBarMetrics:UIBarMetricsDefault]; 

Utilice el código anterior para que funcione. Y utilice una image de tamaño pequeño (40*navigarbarheight) 40 es el ancho de la image

Este es un código de muestra más preciso y preciso para caber en todos los tamaños de pantalla. ayudará

 CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenWidth = screenRect.size.width; [[UINavigationBar appearance] setBackgroundImage:[[UIImage imageNamed:@"header"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, screenWidth-50, 50)] forBarMetrics:UIBarMetricsDefault];