我有一个160帧的WKInterfaceImage动画。动画很棒。现在我想添加一个色调。 This SO question使用Inspector中的Render As Template Image选项提到WatchKit色调方法,但它似乎只适用于单个静态图像。它只对最后一帧进行着色,并在最后一帧中将我的色调在Inspector中着色而不是我的代码色调。我已经尝试仅渲染第一帧并渲染所有帧无效。
我是否必须遍历所有这些或设置范围或在startAnimatingWithImagesInRange方法中包含setTint方法?
rotateButtonImage.setImageNamed("frame")
rotateButtonImage.startAnimatingWithImagesInRange(NSRange(location: 0, length: 159), duration: 1, repeatCount: 1)
rotateButtonImage.setTintColor(UIColor.redColor())
编辑:所以我所做的是创建一个扩展。它看起来像这样。
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
}
}
然后在我awakeWithContext
的自定义VC中,我打电话给:
rotateButtonImage.image = rotateButtonImage.image.imageWithColor(UIColor.redColor())
但出于某种原因,事情并非自动完成。我的WKInterfaceImage被称为rotateButtonImage
,我已经导入了Foundation和WatchKit等。
我的扩展程序或函数返回类型应该是WKInterfaceImage
类型吗?我尝试改变这些,但有很多错误。
所以我想我发现这个扩展程序在WatchKit中不起作用lol
所以你必须使用Inspector方法。但它的色彩仍不适用于我的动画。我想这可能是一个错误?单个图像可以使用色调,但即使代码有效,也可能不使用多个帧。
答案 0 :(得分:1)
setTintColor仅在图像包含单个图像模板时才起作用,如此处所述。
但实际上,有一种方法可以重新着色animatedImage。它不具备高性能,你不想用大量图像来做这件事。
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
}
您以这种方式使用该数组:
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)