2016-03-22 13 views
0

Ich habe eine WKInterfaceImage Animation mit 160 Frames. Animation ist großartig. Jetzt möchte ich einen Farbton hinzufügen. This SO question erwähnt die WatchKit-Farbtonmethode mit der Option "Als Vorlage ausgeben" im Bereich "Informationen", scheint aber nur für ein einzelnes statisches Bild zu funktionieren. Es tönte nur das letzte Bild und es tönte das letzte Bild in der Farbe meiner Tönung im Inspector, nicht in meinem Tönungscode. Ich habe versucht, nur den ersten Frame zu rendern und alle Frames ohne Erfolg zu rendern.Render als Vorlage Bild auf einer animierten WKInterfaceImage

Muss ich alle durchlaufen oder einen Bereich festlegen oder die setTint-Methode in die startAnimatingWithImagesInRange-Methode integrieren?

enter image description here

rotateButtonImage.setImageNamed("frame") 

    rotateButtonImage.startAnimatingWithImagesInRange(NSRange(location: 0, length: 159), duration: 1, repeatCount: 1) 
    rotateButtonImage.setTintColor(UIColor.redColor()) 

EDIT: Also, was ich tat, ist eine Erweiterung erstellen. Es sieht aus wie das.

WKImage + Tint.swift

extension UIImage { 

func imageWithTintColor(colorTint : UIColor) -> UIImage { 

    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
    colorTint.setFill() 

    let context : CGContextRef = UIGraphicsGetCurrentContext()! as CGContextRef 
    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) 
    CGContextFillRect(context, rect) 

    let newImage : UIImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage 
    UIGraphicsEndImageContext() 

    return newImage 
} 
} 

Dann in meiner benutzerdefinierten VC in awakeWithContext Ich rief:

rotateButtonImage.image = rotateButtonImage.image.imageWithColor(UIColor.redColor()) 

aber aus irgendeinem Grund sind die Dinge nicht Auto-Vervollständigung. Mein WKInterfaceImage heißt rotateButtonImage und ich habe Foundation und WatchKit usw. importiert.

Sollte meine Erweiterung oder Funktion Rückgabetyp vom Typ WKInterfaceImage sein? Ich habe versucht, diese zu ändern, habe aber viele Fehler bekommen.

Also ich denke, ich diese Erweiterung herausgefunden wird in WatchKit nicht funktionieren lol

So müssen Sie den Inspector-Methode verwenden. Aber es ist immer noch der Farbton arbeitet nicht an meiner Animation. Ich denke, das könnte ein Fehler sein? Ein einzelnes Bild kann einen Farbton verwenden, aber möglicherweise nicht mehrere Frames, obwohl der Code gültig ist.

Antwort

1

setTintColor funktioniert nur, wenn das Bild eine einzelne Bildvorlage enthält, wie hier beschrieben.

https://developer.apple.com/library/ios/documentation/WatchKit/Reference/WKInterfaceImage_class/index.html#//apple_ref/occ/instm/WKInterfaceImage/setTintColor:

Aber eigentlich ist es eine Möglichkeit, animatedImage umfärben. Es ist nicht performant, und Sie wollen das nicht mit einer großen Anzahl von Bildern machen.

static func animatedImagesWithColor(color: UIColor) -> [UIImage] { 
    var animatedImages = [UIImage]() 

    (0...60).forEach { imageNumber in 
     if let img = UIImage(named: "MyImage\(imageNumber)") { 
      UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale); 

      let context = UIGraphicsGetCurrentContext() 

      color.setFill() 

      CGContextTranslateCTM(context, 0, img.size.height); 
      CGContextScaleCTM(context, 1.0, -1.0); 
      CGContextClipToMask(context, CGRectMake(0, 0, img.size.width, img.size.height), img.CGImage); 
      CGContextFillRect(context, CGRectMake(0, 0, img.size.width, img.size.height)); 

      animatedImages.append(UIGraphicsGetImageFromCurrentImageContext()) 
      UIGraphicsEndImageContext() 

     } 
    } 

    return animatedImages 
} 

Sie, dass Array verwenden diese Art und Weise:

let animation = UIImage.animatedImageWithImages(UIImage.animatedImagesWithColor(.redColor()), duration: 50) 
let range = NSRange(location: 0, length: 60) 

animationGroup.setBackgroundImage(animation) 
animationGroup.startAnimatingWithImagesInRange(range, duration: 50, repeatCount: -1) 
+0

Ja ich bereits erklärt, dass in meinem Beitrag. Vielen Dank. – tymac