2013-10-22 10 views
15

tintColor ist ein Lebensretter, es nimmt App auf eine ganz neue (einfache) Ebene.Kann die neue tintColor-Eigenschaft von UIImageview in iOS 7 zum Animieren von Bildern verwendet werden?

//the life saving bit is the new UIImageRenderingModeAlwaysTemplate mode of UIImage 
UIImage *templateImage = [[UIImage imageNamed:@"myTemplateImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
imageView.image = templateImage; 

//set the desired tintColor 
imageView.tintColor = color; 

Der obige Code wird „Farbe“ das nicht-transparente Teile des Bildes nach dem den Farbton des UIImageView, die für Core-Grafik für etwas Einfaches wie die ach so cool.No Notwendigkeit ist.

Das Problem, das ich gegenüberstelle, ist mit Animationen.

Fortsetzung aus dem obigen Code:

//The array with the names of the images we want to animate 
NSArray *imageNames = @[@"1",@"2"@"3"@"4"@"5"]; 

//The array with the actual images 
NSMutableArray *images = [NSMutableArray new]; 
for (int i = 0; i < imageNames.count; i++) 
{ 
    [images addObject:[[UIImage imageNamed:[imageNames objectAtIndex:i]] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; 
} 

//We set the animation images of the UIImageView to the images in the array 
imageView.animationImages = images; 

//and start animating the animation 
[imageView startAnimating]; 

Die Animation korrekt durchgeführt wird, aber die Bilder verwenden, um ihre ursprüngliche Farbe (das heißt die Farbe in der GFX-Bearbeitungsanwendung verwendet wird) anstelle des UIImageView des tintColor.

Ich bin dabei zu versuchen, die Animation selbst durchzuführen (indem ich ein wenig übertrieben mache, wie durch die Bilder und die Bildeigenschaft des UIImageView mit einer NSTimer-Verzögerung, so dass das menschliche Auge es fangen kann).

Bevor ich das tue, möchte ich fragen, ob die tintColor-Eigenschaft von UIImageView unterstützen soll, was ich damit machen will, d. H. Es für Animationen verwenden.

Danke.

+0

Bitte versuchen Sie meine Antwort und sehen, ob das hilft. –

+0

Haben Sie eine Lösung gefunden? – Alf

Antwort

0

.tintColor kann wahrscheinlich damit umgehen. Ich benutze NSTimers für die setTitleColor-Methode von UIButton die ganze Zeit. Hier ist ein Beispiel.

AKTUALISIERT: Getestet und funktioniert auf iPhone 5s iOS 7.1!

- (void)bringToMain:(UIImage *)imageNam { 

    timer = [NSTimer scheduledTimerWithTimeInterval:.002 
              target:self 
              selector:@selector(animateTint) 
              userInfo:nil 
              repeats:YES]; 
} 

- (void)animateTint { 

    asd += 1.0f; 

    [imageView setTintColor:[UIColor colorWithRed:((asd/100.0f) green:0.0f blue:0.0f alpha:1.0f]]; 

if (asd == 100) { 

     asd = 0.0f 

     [timer invalidate]; 

    } 
} 
+1

Dies wird nicht funktionieren, es gibt keine setTitleColor auf einem UIImage. –

+0

Vielen Dank für das Teilen dieses hehe. Ich werde meine Antwort bald aktualisieren. – Roecrew

+0

@Roecrew wir warten immer noch – deej

2

Anstatt die Bilder selbst zu animieren, habe ich beschlossen, die einzelne Frames mit einer Tönungsfarbe zu machen, und dann lassen Sie UIImage die Animation zu tun. Ich habe eine Kategorie auf UIImage mit den folgenden Methoden:

+ (instancetype)animatedImageNamed:(NSString *)name tintColor:(UIColor *)tintColor duration:(NSTimeInterval)duration 
{ 
    NSMutableArray *images = [[NSMutableArray alloc] init]; 

    short index = 0; 
    while (index <= 1024) 
    { 
     NSString *imageName = [NSString stringWithFormat:@"%@%d", name, index++]; 
     UIImage *image = [UIImage imageNamed:imageName]; 
     if (image == nil) break; 

     [images addObject:[image imageTintedWithColor:tintColor]]; 
    } 

    return [self animatedImageWithImages:images duration:duration]; 
} 

- (instancetype)imageTintedWithColor:(UIColor *)tintColor 
{ 
    CGRect imageBounds = CGRectMake(0, 0, self.size.width, self.size.height); 

    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextTranslateCTM(context, 0, self.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextClipToMask(context, imageBounds, self.CGImage); 

    [tintColor setFill]; 
    CGContextFillRect(context, imageBounds); 

    UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return tintedImage; 
} 

Es funktioniert genau wie + [UIImage animatedImageNamed:duration:] (einschließlich der Suche nach Dateien „image0“ genannt, „image1“, etc.), außer dass es nimmt auch eine Tönung Farbe.

Dank dieser Antwort für die Bereitstellung des Bildtönungs Code: https://stackoverflow.com/a/19152722/321527

+0

Coole Idee. Abhängig von der Anzahl der Bilder und der Größe ist ein wenig Speicher- und CPU-intensiv. Daher sollten Sie diese bei der Erstellung auf die Festplatte zwischenspeichern. –

Verwandte Themen