2014-11-26 8 views
8

C'è un modo per colorare le immagini in un'animazione?UIImage animationImages tint color?

so di poter colorare una sola immagine come questa:

var imageOne:UIImage = UIImage(named: "pullto_1.png")!; 
    imageOne = imageOne.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate); 
    refSequence.image = imageOne; 

Ma quando provo a fare in questo modo semplicemente non dovesse funzionare:

var imageOne:UIImage = UIImage(named: "pullto_1.png")!; 
    imageOne = imageOne.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) 

    var image2:UIImage = UIImage(named: "pullto_2.png")!; 
    image2 = image2.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) 

    var image3:UIImage = UIImage(named: "pullto_3.png")!; 
    image3 = image3.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) 

    var image4:UIImage = UIImage(named: "pullto_4.png")!; 
    image4 = image4.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) 

    refSequence.animationImages = NSArray(objects: imageOne, 
     image2, 
     image3, 
     image4 

    ); 

    refSequence.animationDuration = 1.4; 
    refSequence.animationRepeatCount = 99; 
    refSequence.startAnimating(); 

Sto facendo qualcosa di sbagliato ? C'è un modo per colorare le immagini nell'animazione?

Grazie

risposta

9

Ok, ho sperato che ci sia una soluzione più semplice, ma questo è quello che ho finito per fare:

Questa funzione creerà una nuova immagine con il colore desiderato:

func imageWithColor(img:UIImage, color:UIColor)->UIImage{ 
    UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale); 
    var context = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(context, 0, img.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextSetBlendMode(context, kCGBlendModeNormal); 
    var rect = CGRectMake(0, 0, img.size.width, img.size.height); 
    CGContextClipToMask(context, rect, img.CGImage) 
    color.setFill(); 
    CGContextFillRect(context, rect); 
    var newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

E poi si può chiamare in questo modo:

var imageOne:UIImage = UIImage(named: "pullto_1.png")!; 
    imageOne = imageWithColor(imageOne, color: UIColor.redColor()); 
    var image2:UIImage = UIImage(named: "pullto_2.png")!; 
    image2 = imageWithColor(image2, color: UIColor.redColor()); 
    var image3:UIImage = UIImage(named: "pullto_3.png")!; 
    image3 = imageWithColor(image3, color: UIColor.redColor()); 
    var image4:UIImage = UIImage(named: "pullto_4.png")!; 
    image4 = imageWithColor(image4, color: UIColor.redColor()); 

    loaderS.animationImages = NSArray(objects: imageOne, 
     image2, 
     image3, 
     image4 

    ); 



    loaderS.animationDuration = 1.4; 
    loaderS.animationRepeatCount = 99; 
    loaderS.startAnimating(); 
4

Ecco un pratico UIImage estensione:

import UIKit 

extension UIImage { 

    func imageWithTint(tint: UIColor) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
     let context = UIGraphicsGetCurrentContext() 
     CGContextTranslateCTM(context, 0, size.height) 
     CGContextScaleCTM(context, 1.0, -1.0) 
     CGContextSetBlendMode(context, .Normal) 
     let rect = CGRect(origin: .zero, size: size) 
     CGContextClipToMask(context, rect, CGImage) 
     tint.setFill() 
     CGContextFillRect(context, rect) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image; 
    } 

} 
2

C'è un rdar su questo problema (http://www.openradar.me/23517334) e il problema persiste ancora su IOS 11.

ho adattato esempi di codice di cui sopra per Swift 4.

extension UIImage { 
    func image(withTintColor color: UIColor) -> UIImage { 
     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 rect = CGRect(origin: .zero, size: size) 
     context?.clip(to: rect, mask: cgImage!) 
     color.setFill() 
     context?.fill(rect) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return image! 
    } 
}