tab sizes icon custom bottom bar ios uitabbar

ios - sizes - ¿Color de UITabBar no seleccionado?



toolbar xcode (11)

Tengo una UITabBar con 5 artículos. Quiero cambiar el color no seleccionado de todos los artículos. Los elementos no están declarados en las clases UIViewController (los construí y vinculé las vistas en el Guión gráfico).

¿Hay un código como este: [[UITabBar appearance] set***UN***SelectedImageTintColor:[UIColor whiteColor]]; ?


@ ImageGray de imageWithColor: solución con Xamarin:

using CoreGraphics; using UIKit; namespace Example { public static class UIImageExtensions { public static UIImage ImageWithColor(this UIImage image, UIColor color) { UIGraphics.BeginImageContextWithOptions(image.Size, false, image.CurrentScale); color.SetFill(); var context = UIGraphics.GetCurrentContext(); context.TranslateCTM(0, image.Size.Height); context.ScaleCTM(1.0f, -1.0f); context.SetBlendMode(CoreGraphics.CGBlendMode.Normal); var rect = new CGRect(0, 0, image.Size.Width, image.Size.Height); context.ClipToMask(rect, image.CGImage); context.FillRect(rect); var newImage = UIGraphics.GetImageFromCurrentImageContext() as UIImage; UIGraphics.EndImageContext(); return newImage; } } }

Luego, utilícelo al configurar los elementos de la barra de pestañas:

var image = UIImage.FromBundle("name"); barItem.Image = image.ImageWithColor(UIColor.Gray).ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); barItem.SelectedImage = image.ImageWithColor(UIColor.Red).ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)


En iOS 10 y superior (!), Hay 3 posibles soluciones fáciles:

  1. Instancia del código (veloz):

    self.tabBar.unselectedItemTintColor = unselectedcolor

  2. Instancia de IB:

    Agregue una ruta clave: unselectedItemTintColor

    de tipo: Color

  3. Aspecto global (rápido):

    UITabBar.appearance (). UnselectedItemTintColor = unselectedcolor


Esto no funcionará en iOS 7 por lo que puedo decir. En particular, tintColor de la barra de pestañas definirá el color de la pestaña seleccionada , no de las no seleccionadas. Si desea cambiar el valor predeterminado en iOS 7, parece que tiene que usar diferentes iconos (en el color que le gusta tener para las pestañas no seleccionadas) y establecer el color del texto.

Este ejemplo debe teñir las pestañas seleccionadas en rojo y renderizar otras en verde. Ejecute este código en su TabBarController:

// set color of selected icons and text to red self.tabBar.tintColor = [UIColor redColor]; [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor redColor], NSForegroundColorAttributeName, nil] forState:UIControlStateSelected]; // set color of unselected text to green [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor greenColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal]; // set selected and unselected icons UITabBarItem *item0 = [self.tabBar.items objectAtIndex:0]; // this way, the icon gets rendered as it is (thus, it needs to be green in this example) item0.image = [[UIImage imageNamed:@"unselected-icon.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; // this icon is used for selected tab and it will get tinted as defined in self.tabBar.tintColor item0.selectedImage = [UIImage imageNamed:@"selected-icon.png"];

Si configura el ícono solo en el guión gráfico, puede controlar el color de la pestaña seleccionada solamente (tintColor). Todos los demás iconos y el texto correspondiente se dibujarán en gris.

¿Tal vez alguien sabe una manera más fácil de adoptar los colores en iOS 7?


Extendiendo la respuesta de @Sven Tiffe para iOS 7, puede obtener su código para teñir automáticamente las imágenes UITabBar no seleccionadas agregadas en el guión gráfico. El siguiente enfoque le ahorrará tener que crear dos conjuntos de imágenes de icono (es decir, seleccionadas o no) y tener que cargarlas programáticamente. Agregue el método de categoría imageWithColor: (consulte - ¿Cómo puedo cambiar la imagen tintColor en iOS y WatchKit? ) A su proyecto luego ponga lo siguiente en su método personalizado UITabBarController viewDidLoad:

// set the selected colors [self.tabBar setTintColor:[UIColor whiteColor]]; [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor whiteColor], NSForegroundColorAttributeName, nil] forState:UIControlStateSelected]; UIColor * unselectedColor = [UIColor colorWithRed:184/255.0f green:224/255.0f blue:242/255.0f alpha:1.0f]; // set color of unselected text [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:unselectedColor, NSForegroundColorAttributeName, nil] forState:UIControlStateNormal]; // generate a tinted unselected image based on image passed via the storyboard for(UITabBarItem *item in self.tabBar.items) { // use the UIImage category code for the imageWithColor: method item.image = [[item.selectedImage imageWithColor:unselectedColor] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; }

Crea una Categoría llamada UIImage + Overlay y en UIImage + Overlay.m (extraída de esta respuesta ):

@implementation UIImage(Overlay) - (UIImage *)imageWithColor:(UIColor *)color1 { UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(context, 0, self.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextSetBlendMode(context, kCGBlendModeNormal); CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); CGContextClipToMask(context, rect, self.CGImage); [color1 setFill]; CGContextFillRect(context, rect); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } @end


La nueva respuesta para hacer esto programáticamente a partir de iOS 10+ es utilizar la API unselectedItemTintColor . Por ejemplo, si ha inicializado el controlador de la barra de pestañas dentro de su AppDelegate , se vería como el siguiente:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { ... let firstViewController = VC1() let secondViewController = VC2() let thirdViewController = VC3() let tabBarCtrl = UITabBarController() tabBarCtrl.viewControllers = [firstViewController, secondViewController, thirdViewController] // set the color of the active tab tabBarCtrl.tabBar.tintColor = UIColor.white // set the color of the inactive tabs tabBarCtrl.tabBar.unselectedItemTintColor = UIColor.gray ... }


Refiriéndose a la respuesta desde aquí: UITabBar tint en iOS 7

Puede establecer el color del tinte para los botones de la barra de pestañas seleccionados y no seleccionados de esta manera:

[[UIView appearanceWhenContainedIn:[UITabBar class], nil] setTintColor:[UIColor redColor]]; [[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]];

La primera línea establece el color no seleccionado, rojo en este ejemplo, al configurar el tintColor de UIView cuando está contenido en una barra de pestañas. Tenga en cuenta que esto solo establece el color del tinte de la imagen no seleccionada; no cambia el color del texto debajo de él.

La segunda línea establece el color del tinte de la imagen seleccionada de la barra de pestañas en verde.


SO dice que no puedo eliminar la respuesta aceptada (lo intenté), pero obviamente, hay muchos votos hacia arriba para comentarios que esto no funciona para iOS 7.

Vea la otra respuesta a continuación con muchas más votaciones ascendentes, o el enlace en el comentario de @ Liam a esta respuesta.

solo para iOS 6

Debería ser tan simple como esto:

[[UITabBar appearance] setTintColor:[UIColor grayColor]]; // for unselected items that are gray [[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]]; // for selected items that are green


Traduciendo la respuesta del usuario3719695 a Swift, que ahora usa extensiones:

UIImage + Overlay.swift

extension UIImage { func imageWithColor(color1: UIColor) -> UIImage { UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) color1.setFill() let context = UIGraphicsGetCurrentContext() CGContextTranslateCTM(context, 0, self.size.height) CGContextScaleCTM(context, 1.0, -1.0); CGContextSetBlendMode(context, CGBlendMode.Normal) let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect CGContextClipToMask(context, rect, self.CGImage) CGContextFillRect(context, rect) let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage UIGraphicsEndImageContext() return newImage } }

customTabBar.swift

override func viewDidLoad() { super.viewDidLoad() for item in self.tabBar.items! { item.image = item.selectedImage?.imageWithColor(unselectedColor).imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) //In case you wish to change the font color as well let attributes = [NSForegroundColorAttributeName: unselectedColor] item.setTitleTextAttributes(attributes, forState: UIControlState.Normal) } }


Tuve que mover el código a viewWillAppear porque en viewDidLoad las imágenes aún no estaban configuradas.

Traductor de Swift 4

import Foundation import UIKit extension UIImage { func with(color: UIColor) -> UIImage { guard let cgImage = self.cgImage else { return self } UIGraphicsBeginImageContextWithOptions(size, false, scale) let context = UIGraphicsGetCurrentContext()! context.translateBy(x: 0, y: size.height) context.scaleBy(x: 1.0, y: -1.0) context.setBlendMode(.normal) let imageRect = CGRect(x: 0, y: 0, width: size.width, height: size.height) context.clip(to: imageRect, mask: cgImage) color.setFill() context.fill(imageRect) let newImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext(); return newImage } } class MYTabBarController: UITabBarController { let unselectedColor = UIColor(red: 108/255.0, green: 110/255.0, blue: 114/255.0, alpha: 1.0) let selectedColor = UIColor.blue() override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Unselected state colors for item in self.tabBar.items! { item.image = item.selectedImage!.with(color: unselectedColor).withRenderingMode(.alwaysOriginal) } UITabBarItem.appearance().setTitleTextAttributes([.foregroundColor : unselectedColor], for: .normal) // Selected state colors tabBar.tintColor = selectedColor UITabBarItem.appearance().setTitleTextAttributes([.foregroundColor : selectedColor], for: .selected) } }


Versión Swift-

UITabBar.appearance().tintColor = UIColor.gray UITabBar.appearance().unselectedItemTintColor = UIColor.gray


Versión de Swift 4 (sin opciones opcionales de desenvolvimiento implícito):

UIImage + Overlay.swift

import UIKit extension UIImage { func with(color: UIColor) -> UIImage? { guard let cgImage = self.cgImage else { return self } UIGraphicsBeginImageContextWithOptions(size, false, scale) if let context = UIGraphicsGetCurrentContext() { context.translateBy(x: 0, y: size.height) context.scaleBy(x: 1.0, y: -1.0) context.setBlendMode(.normal) let imageRect = CGRect(x: 0, y: 0, width: size.width, height: size.height) context.clip(to: imageRect, mask: cgImage) color.setFill() context.fill(imageRect) if let newImage = UIGraphicsGetImageFromCurrentImageContext() { UIGraphicsEndImageContext(); return newImage } } return nil; } }


CustomTabBarController.swift

class CustomTabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() if #available(iOS 10.0, *) { self.tabBar.unselectedItemTintColor = UIColor.init(white: 1, alpha: 0.5) } else { // Fallback on earlier versions if let items = self.tabBar.items { let unselectedColor = UIColor.init(white: 1, alpha: 0.5) let selectedColor = UIColor.white // Unselected state colors for item in items { if let selectedImage = item.selectedImage?.with(color: unselectedColor)?.withRenderingMode(.alwaysOriginal) { item.image = selectedImage } } UITabBarItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor : unselectedColor], for: .normal) // Selected state colors tabBar.tintColor = selectedColor UITabBarItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor : selectedColor], for: .selected) } } UITabBarItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "overpass-light", size: 12)!, NSAttributedStringKey.foregroundColor: UIColor.white], for: UIControlState.normal) } }