Значения элементов панели табуляции по умолчанию с помощью быстрого Xcode 6
Окружающая среда:
- Xcode 6 beta 4
- Быстрый язык
- Приложение с вкладками iOS (проект по умолчанию xCode)
Как я могу изменить серый цвет по умолчанию на вкладках на что-то еще? (Желательно в глобальном масштабе)
Что касается моих исследований, мне нужно как-то изменить режим рендеринга изображений для каждой вкладки в режиме оригинальной рендеринга, но я не знаю, как
Ответы
Ответ 1
Каждый элемент вкладки табуляции (по умолчанию) состоит из текста и значка. Весьма легко изменить цвета текста по всему миру, указав внешний вид:
// you can add this code to you AppDelegate application:didFinishLaunchingWithOptions:
// or add it to viewDidLoad method of your TabBarController class
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.magentaColor()], forState:.Normal)
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.redColor()], forState:.Selected)
С ситуацией с изображениями немного сложнее. Вы не можете определить их внешний вид во всем мире. Вы должны переопределить их в своем классе TabBarController. Добавьте ниже код viewDidLoad
в класс TabBarController
:
for item in self.tabBar.items as [UITabBarItem] {
if let image = item.image {
item.image = image.imageWithColor(UIColor.yellowColor()).imageWithRenderingMode(.AlwaysOriginal)
}
}
Как мы знаем, в классе UIImage нет метода imageWithColor(...)
. Итак, вот реализация расширения:
// Add anywhere in your app
extension UIImage {
func imageWithColor(tintColor: UIColor) -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let context = UIGraphicsGetCurrentContext() as CGContextRef
CGContextTranslateCTM(context, 0, self.size.height)
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, .Normal)
let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect
CGContextClipToMask(context, rect, self.CGImage)
tintColor.setFill()
CGContextFillRect(context, rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage
UIGraphicsEndImageContext()
return newImage
}
}
imageWithColor
был заимствован из этого ответа: fooobar.com/questions/26998/...
Ответ 2
У меня недостаточно репутации для комментирования комментариев, но многим интересно, как изменить цвет выбранного изображения.
просто добавьте еще одну проверку if let
после
if let image = item.image
просто так:
if let selectedImage = item.selectedImage {
item.selectedImage = selectedImage.imageWithColor(UIColor.yellowColor()).imageWithRenderingMode(.AlwaysOriginal)
}
это решило проблему отлично.
И небольшое дополнение, поскольку Swift 1.2 и Xcode 6.3.2 вам нужны
for item in self.tabBar.items as! [UITabBarItem]
вместо
for item in self.tabBar.items as [UITabBarItem]
Надеюсь, что это поможет!
Ответ 3
Swift 2.0
Чтобы изменить цвет по умолчанию для изображений на вкладке, добавьте ниже код viewDidLoad
вашего класса TabBarController
:
for item in self.tabBar.items! as [UITabBarItem] {
if let image = item.image {
item.image = image.imageWithColor(UIColor.yellowColor()).imageWithRenderingMode(.AlwaysOriginal)
}
}
Обновите расширение imageWithColor
. Используется с указанным выше методом и следует размещать вне класса TabBarController
:
extension UIImage {
func imageWithColor(tintColor: UIColor) -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let context = UIGraphicsGetCurrentContext()! as CGContextRef
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)
tintColor.setFill()
CGContextFillRect(context, rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage
UIGraphicsEndImageContext()
return newImage
}
}
Нет изменений в том, как текст окрашивается, но только для справки. Также следует добавить приведенный ниже код к viewDidLoad
:
// you can add this code to you AppDelegate application:didFinishLaunchingWithOptions:
// or add it to viewDidLoad method of your TabBarController class
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.magentaColor()], forState:.Normal)
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.redColor()], forState:.Selected)
Ответ 4
Swift 3.0
Чтобы изменить цвет по умолчанию для изображений на вкладке, добавьте ниже код viewDidLoad
вашего класса TabBarController
:
for item in self.tabBar.items! as [UITabBarItem] {
if let image = item.image {
item.image = image.imageWithColor(tintColor: UIColor.yellow).withRenderingMode(.alwaysOriginal)
}
}
Обновите расширение imageWithColor
. Используется с указанным выше методом и следует размещать вне класса TabBarController
:
extension UIImage {
func imageWithColor(tintColor: UIColor) -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let context = UIGraphicsGetCurrentContext()! as CGContext
context.translateBy(x: 0, y: self.size.height)
context.scaleBy(x: 1.0, y: -1.0);
context.setBlendMode(CGBlendMode.normal)
let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
context.clip(to: rect, mask: self.cgImage!)
tintColor.setFill()
context.fill(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()! as UIImage
UIGraphicsEndImageContext()
return newImage
}
}