做聊天功能时,美工给了一张绿色泡泡素材,但有的场景下要求泡泡是白色的,而美工又没提供白色版本,这时我们就要会如何自己修改图片颜色。
方法一:用CoreGraphic绘制
优点:完全自己控制,可以绘制包含多种颜色的图片
缺点:形状大小都需要计算,代码较多,尤其在图片形状比较复杂时
方法二:使用遮罩mask
优点:形状不需要计算
缺点:大小需要计算;颜色单一,由被遮罩的图层颜色决定
UIImage *bubble = self.backImageView.image;
UIImageView *ImageView = [[UIImageView alloc] init];
[ImageView setSize:self.frame.size];
[ImageView setImage:[bubble stretchableImageWithLeftCapWidth:30 topCapHeight:30]];
CALayer *layer = ImageView.layer;
layer.frame = (CGRect){{0,0},ImageView.layer.frame.size};
self.backImageView.image = nil;
self.backImageView.backgroundColor = [UIColor whiteColor];
self.backImageView.layer.mask = layer;
[self.backImageView setNeedsDisplay];
方法三:使用tintColor
优点:形状大小都不需要计算
缺点:颜色单一,由UIImageView的tintColor决定
self.backImageView.image = [self.backImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
self.backImageView.tintColor = [UIColor whiteColor];
总结
很明显,使用tintColor来实现最简单。但是tintColor一般配合PNG图片,并且图片的渲染模式要设置为UIImageRenderingModeAlwaysTemplate。效果就是图片中带透明度的部分会被完全透明化,完全不透明的部分颜色跟随tintColor。
When you elect to treat an image as a template, the system ignores the image’s color information and creates an image stencil based on the alpha values in the image (parts of the image with an alpha value of less than 1.0 get treated as completely transparent).