2014-07-23 7 views
7

Es ist bekannt, dass die Tönung Farbe ausgewählt (oder aktiv) Elemente in einer UITabBarController kann leicht geändert werden, hier ein Beispiel:Veränderung nur eine bestimmte UITabBarItem Tönungsfarbe

myBarController.tabBar.tintColor = [UIColor redColor]; 

In diesem Fall Alle Registerkartenelemente in der TabBar werden rot dargestellt, sobald sie aktiv sind. Dies gilt wiederum für alle der Elemente in dieser Registerkarte.

Wie kann sich die aktive Tönungsfarbe zwischen anderen Registerkartenelementen in derselben Leiste unterscheiden? Zum Beispiel könnte ein Gegenstand einen roten Farbton haben, während er ausgewählt ist, während ein anderer einen blauen Farbton haben kann.

Ich bin mir bewusst, dass dies wahrscheinlich durch Neuzeichnen und Unterklassen der gesamten Tab-Leiste gelöst werden kann. Dies ist jedoch die einzige Veränderung, die ich brauche, und es scheint übertrieben, dies zu tun. Ich versuche nicht, den Stil zu ändern oder wie die Gegenstände in irgendeiner Weise gerendert werden, nur um diesen Stil zwischen verschiedenen Gegenständen zu unterscheiden.

Ich habe keine Antworten auf diese Frage überall gesehen, die 7 zu den Updates in iOS relevant sind und 8.

+0

Bitte überprüfen Sie meine ausführliche Antwort auf: https://stackoverflow.com/questions/43002013/ different-colors-for-tabbar-articles-in-tab-bar-controller/47644313 # 47644313 – erickva

Antwort

2

ich auf this answer etwas experimentieren und basiert haben gefunden, einen Weg zu tun, was ich wollen, ohne Unterklasse UITabBarItem oder UITabBar!

Im Grunde ist die Idee, eine Methode von UIImage zu erstellen, die das Verhalten der Tint-Maske von UITabBar nachahmt, während es in seiner "ursprünglichen" Form gerendert wird und die native Tönungsmaske vermeidet.

Alles, was Sie tun müssen, ist eine neue Instanz Methode von UIImage zu schaffen, die ein Bild mit der Farbe maskiert zurück wollen wir:

@interface UIImage(Overlay) 
- (instancetype)tabBarImageWithCustomTint:(UIColor *)tintColor; 
@end 

@implementation UIImage(Overlay) 

- (instancetype)tabBarImageWithCustomTint:(UIColor *)tintColor 
{ 
    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); 
    [tintColor setFill]; 
    CGContextFillRect(context, rect); 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    newImage = [newImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
    return newImage; 
} 
@end 

Dies ist eine ziemlich einfache Version des Codes in der Antwort, die ich geschrieben Mit einer Ausnahme: Der Rendermodus des zurückgegebenen Bilds ist immer auf "Original" eingestellt, wodurch sichergestellt wird, dass die Standardmaske für UITabBar nicht angewendet wird. Nun, alles, was benötigt wird, ist diese Methode zu verwenden, wenn das Element Tableiste Bearbeitung:

navController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"title" image:normal_image selectedImage:[selected_image tabBarImageWithCustomTint:[UIColor redColor]]]; 

Unnötig zu sagen, selected_image ist das normale Bild bekommt man von UIImage imageNamed: und die [UIColor redColor kann ersetzt werden, mit jeder Farbe man sich wünscht.

9

Es gibt eine viel einfachere Möglichkeit, dies zu tun! hinzufügen Zu den Viewcontroller der UITabBar Artikel sollte

- (void) viewWillAppear:(BOOL)animated { 
    // change tint color to red 
    [self.tabBarController.tabBar setTintColor:[UIColor redColor]]; 
    [super viewWillAppear: animated]; 
} 

Insert diese zu dem anderen Viewcontrollers

- (void) viewWillAppear:(BOOL)animated { 
    // change tint color to black 
    [self.tabBarController.tabBar setTintColor:[UIColor blackColor]]; 
    [super viewWillAppear: animated]; 
} 

ich dies in einer anderen Farbe sein, um unterschiedliche Tönung Farben in jedem Viewcontroller zum Beispiel zu erhalten: [rot | schwarz | grün | pink]

+1

Für alle, die swift verwenden: 'tabBarController? .tabBar.tintColor = UIColor.redColor() ' – Andrej

3

@ element119 Lösung mit schnellen (für Sie faul Männer):

extension UIImage { 
    func tabBarImageWithCustomTint(tintColor: UIColor) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
     let context: CGContextRef = UIGraphicsGetCurrentContext() 

     CGContextTranslateCTM(context, 0, self.size.height) 
     CGContextScaleCTM(context, 1.0, -1.0) 
     CGContextSetBlendMode(context, kCGBlendModeNormal) 
     let rect: CGRect = CGRectMake(0, 0, self.size.width, self.size.height) 

     CGContextClipToMask(context, rect, self.CGImage) 

     tintColor.setFill() 
     CGContextFillRect(context, rect) 

     var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     newImage = newImage.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 
     return newImage 
    } 
} 

ich diesen Code bin mit meinem mittleren Symbol tönen rot:

if let items = self.tabBar.items as? [UITabBarItem] { 
    let button = items[1] 
    button.image = button.image?.tabBarImageWithCustomTint(UIColor.redColor()) 
} 
+1

SWIFT 2: CGBlendMode.Normal statt kCGBlendModeNormal Danke für die obige Antwort –

0

swift xcode7.1 getestet :

extension UIImage { 
    func tabBarImageWithCustomTint(tintColor: UIColor) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
     let context: CGContextRef = UIGraphicsGetCurrentContext()! 

     CGContextTranslateCTM(context, 0, self.size.height) 
     CGContextScaleCTM(context, 1.0, -1.0) 
     CGContextSetBlendMode(context, CGBlendMode.Normal) 
     let rect: CGRect = CGRectMake(0, 0, self.size.width, self.size.height) 

     CGContextClipToMask(context, rect, self.CGImage) 

     tintColor.setFill() 
     CGContextFillRect(context, rect) 

     var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     newImage = newImage.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 
     return newImage 
    } 
} 

die Kompatibilität Fehler in @Binsh Antwort Fest

2

Das funktionierte gut für mich !! Code für Swift 3

extension UIImage { 
    func tabBarImageWithCustomTint(tintColor: UIColor) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
     let context: CGContext = UIGraphicsGetCurrentContext()! 
     context.translateBy(x: 0, y: self.size.height) 
     context.scaleBy(x: 1.0, y: -1.0) 
     context.setBlendMode(CGBlendMode(rawValue: 1)!) 
     let rect: CGRect = 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) 
     var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 
     newImage = newImage.withRenderingMode(UIImageRenderingMode.alwaysOriginal) 
     return newImage 
    } 
} 

und nach ...

button.image = button.image?.tabBarImageWithCustomTint(tintColor: UIColor(red: 30.0/255.0, green: 33.0/255.0, blue: 108.0/255.0, alpha: 1.0)) 

dank;))