true tag should not images for examples example description alternative ios swift uinavigationbar ios11

ios - tag - seo images size



Imagen de fondo personalizada con títulos grandes NavigationBar en iOS 11 (6)

Aprovechando la respuesta de oldrinmendez, esa solución funciona perfectamente para un degradado horizontal.

Para un gradiente VERTICAL, pude usar la misma función de la respuesta de oldrinmendez llamándola nuevamente en scrollViewDidScroll. Esto ajusta continuamente la altura de la imagen del degradado a medida que el usuario se desplaza.

Comience con la función de oldrinmendez:

func imageWithGradient(startColor:UIColor, endColor:UIColor, size:CGSize, horizontally:Bool) -> UIImage? { let gradientLayer = CAGradientLayer() gradientLayer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height) gradientLayer.colors = [startColor.cgColor, endColor.cgColor] if horizontally { gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) } else { gradientLayer.startPoint = CGPoint(x: 0.5, y: 0) gradientLayer.endPoint = CGPoint(x: 0.5, y: 1) } UIGraphicsBeginImageContext(gradientLayer.bounds.size) gradientLayer.render(in: UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image }

Cree una función de actualización para llamarla con las opciones que desee:

func updateImageWithGradient() { let navBarHeight = self.navigationController?.navigationBar.frame.size.height let statusBarHeight = UIApplication.shared.statusBarFrame.height let heightAdjustment: CGFloat = 2 let gradientHeight = navBarHeight! + statusBarHeight + heightAdjustment let bgimage = imageWithGradient(startColor: UIColor.red, endColor: UIColor.orange, size: CGSize(width: UIScreen.main.bounds.size.width, height: gradientHeight), horizontally: false) navigationController?.navigationBar.barTintColor = UIColor(patternImage: bgimage!) }

Finalmente, agregue la función de actualización a scrollViewDidScroll & ViewDidApper: use ViewDidAppear para que se devuelva la altura correcta de la barra de navegación

override func viewDidAppear(_ animated: Bool) { updateImageWithGradient() } override func scrollViewDidScroll(_ scrollView: UIScrollView) { DispatchQueue.main.async { updateImageWithGradient() } }

¿Cómo se configura una imagen de fondo personalizada para la barra de navegación de título grande en iOS 11? Estoy usando una subclase personalizada que he asignado a los controles de navegación en el guión gráfico.

Así es como creo mi barra de navegación personalizada:

class CustomNavigationController: UINavigationController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.navigationBar.tintColor = UIColor(red:1, green:1, blue:1, alpha:0.6) self.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] if #available(iOS 11.0, *) { self.navigationBar.prefersLargeTitles = true self.navigationItem.largeTitleDisplayMode = .automatic self.navigationBar.largeTitleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] self.navigationBar.barTintColor = UIColor.green } self.navigationBar.isTranslucent = false self.navigationBar.setBackgroundImage(#imageLiteral(resourceName: "navigationBarBackground"), for: .default) self.navigationBar.shadowImage = #imageLiteral(resourceName: "navigationBarShadow") } }

Extrañamente, el setBackgroundImage(image, for: .default) no funciona para los títulos grandes. ¿Funcionó antes con iOS 10 y también si giro el iPhone (y activo la pequeña barra de navegación) el fondo está de vuelta?

Edición: la imagen de backgroundImage aún se renderiza pero de alguna manera está oculta. Solo si comienza a desplazarse y aparece la barra de navegación "normal", la imagen de fondo es visible. También el barTintColor es completamente ignorado en este caso.


Cambiar la barraTint no me funcionó, así que cambio la capa dentro de la barra de navegación

navigationBar.layer.backgroundColor = UIColor(patternImage: UIImage(named: "BG-Roof1")!.resizableImage(withCapInsets: UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0), resizingMode: .stretch)).cgColor


En Xamarin sería así:

this.NavigationBar.BackgroundColor = UIColor.Clear; var gradientLayer = new CAGradientLayer { Frame = new CGRect(0, 0, UIApplication.SharedApplication.StatusBarFrame.Width, UIApplication.SharedApplication.StatusBarFrame.Height + this.NavigationBar.Frame.Height), Colors = new CGColor[] {Constants.Defaults.Navigation.RealBlueColor.ToCGColor(), Constants.Defaults.Navigation.RealBlueColor.ToCGColor()} }; UIGraphics.BeginImageContext(gradientLayer.Bounds.Size); gradientLayer.RenderInContext((UIGraphics.GetCurrentContext())); UIImage image = UIGraphics.GetImageFromCurrentImageContext(); UIGraphics.EndImageContext(); this.View.Layer.InsertSublayer(gradientLayer, 0); this.NavigationBar.BarTintColor = UIColor.FromPatternImage(image);

El this.View.Layer.Insert es opcional. Lo necesito cuando estoy "curvando" una imagen en la barra de navegación


En iOS 11 ya no necesita configurar BackgroundImage (eliminar su declaración) si usa títulos grandes. En su lugar necesitas usar BarTintColor.

class CustomNavigationController: UINavigationController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.navigationBar.tintColor = UIColor(red:1, green:1, blue:1, alpha:0.6) self.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] if #available(iOS 11.0, *) { self.navigationBar.prefersLargeTitles = true self.navigationItem.largeTitleDisplayMode = .automatic self.navigationBar.largeTitleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] self.navigationBar.barTintColor = UIColor(red:1, green:1, blue:1, alpha:1) } else { self.navigationBar.setBackgroundImage(#imageLiteral(resourceName: "navigationBarBackground"), for: .default) } self.navigationBar.shadowImage = #imageLiteral(resourceName: "navigationBarShadow") self.navigationBar.isTranslucent = false } }


Prueba este código (Swift 4.0):

en viewDidLoad ()

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black] if #available(iOS 11.0, *) { self.navigationController?.navigationBar.prefersLargeTitles = true self.navigationItem.largeTitleDisplayMode = .automatic self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black] } else { //iOS <11.0 } self.title = "Title" self.navigationController?.navigationBar.barTintColor = UIColor(patternImage: #imageLiteral(resourceName: "nav_bg")) self.navigationController?.navigationBar.isTranslucent = false


Tuve el mismo problema, lo arreglé por

Elimine setBackgroundImage y use color barTint con imagen de patrón

let bgimage = imageWithGradient(startColor: UIColor.red, endColor: UIColor.yellow, size: CGSize(width: UIScreen.main.bounds.size.width, height: 1)) self.navigationBar.barTintColor = UIColor(patternImage: bgimage!)

Obtener imagen con colores degradados.

func imageWithGradient(startColor:UIColor, endColor:UIColor, size:CGSize, horizontally:Bool = true) -> UIImage? { let gradientLayer = CAGradientLayer() gradientLayer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height) gradientLayer.colors = [startColor.cgColor, endColor.cgColor] if horizontally { gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) } else { gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0) gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0) } UIGraphicsBeginImageContext(gradientLayer.bounds.size) gradientLayer.render(in: UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image }