在动画 WKInterfaceImage 上渲染为模板图像
Render As Template Image on an animated WKInterfaceImage
我有一个 160 帧的 WKInterfaceImage 动画。动画很棒。现在我想添加一种色调。 This SO question 提到了在检查器中使用渲染为模板图像选项的 WatchKit 色调方法,但它似乎只适用于单个静态图像。它仅对最后一帧进行着色,并且将最后一帧着色为我在检查器中的色调,而不是我的代码色调。我试过只渲染第一帧并渲染所有帧都无济于事。
我是否必须遍历所有这些或设置范围或将 setTint 方法合并到 startAnimatingWithImagesInRange 方法中?
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
}
}
然后在我的自定义 VC 中 awakeWithContext
我调用了:
rotateButtonImage.image = rotateButtonImage.image.imageWithColor(UIColor.redColor())
但由于某些原因,事情没有自动完成。我的 WKInterfaceImage 名为 rotateButtonImage
,我已经导入了 Foundation 和 WatchKit 等。
我的扩展或函数 return 类型应该改为 WKInterfaceImage
类型吗?我尝试更改这些但出现大量错误。
所以我想我发现这个扩展在 WatchKit 中不起作用 lol
所以你必须使用Inspector方法。但是我的动画仍然没有色调。我认为这可能是一个错误?单个图像可以使用色调,但可能不能使用多个帧,即使代码有效。
setTintColor 仅在图像包含单个图像模板时有效,如此处所述。
但是,实际上,有一种方法可以为动画图像重新着色。它的性能不佳,而且您不想对大量图像执行此操作。
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)
我有一个 160 帧的 WKInterfaceImage 动画。动画很棒。现在我想添加一种色调。 This SO question 提到了在检查器中使用渲染为模板图像选项的 WatchKit 色调方法,但它似乎只适用于单个静态图像。它仅对最后一帧进行着色,并且将最后一帧着色为我在检查器中的色调,而不是我的代码色调。我试过只渲染第一帧并渲染所有帧都无济于事。
我是否必须遍历所有这些或设置范围或将 setTint 方法合并到 startAnimatingWithImagesInRange 方法中?
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
}
}
然后在我的自定义 VC 中 awakeWithContext
我调用了:
rotateButtonImage.image = rotateButtonImage.image.imageWithColor(UIColor.redColor())
但由于某些原因,事情没有自动完成。我的 WKInterfaceImage 名为 rotateButtonImage
,我已经导入了 Foundation 和 WatchKit 等。
我的扩展或函数 return 类型应该改为 WKInterfaceImage
类型吗?我尝试更改这些但出现大量错误。
所以我想我发现这个扩展在 WatchKit 中不起作用 lol
所以你必须使用Inspector方法。但是我的动画仍然没有色调。我认为这可能是一个错误?单个图像可以使用色调,但可能不能使用多个帧,即使代码有效。
setTintColor 仅在图像包含单个图像模板时有效,如此处所述。
但是,实际上,有一种方法可以为动画图像重新着色。它的性能不佳,而且您不想对大量图像执行此操作。
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)