Как показать цветное изображение оттенка в CALayer на iOS?
Мне нужно показать цветное изображение оттенка в CALayer.
Он работает для UIImageView:
imageView.image = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
Но CALayer показывает изображение с его исходным цветом, а не цветом оттенка.
let tintedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
layer.contents = tintedImage.CGImage
Есть ли способ показать тонированное изображение в CALayer?
Демо:
https://github.com/exchangegroup/calayer-with-tint-colored-image
![enter image description here]()
Ответы
Ответ 1
Я думаю, что мое решение гораздо менее громоздко:
let maskLayer = CALayer()
maskLayer.frame = layer.bounds
maskLayer.contents = tintedImage.CGImage
layer.mask = maskLayer
layer.backgroundColor = UIColor.redColor().CGColor
дайте мне знать, если это работает нормально :)
Ответ 2
Я предполагаю, что это возможно на OSX, используя свойство filter CALayer, но в ios не используется.
Я думаю, вы должны полностью перерисовать изображение, вот пример кода, он отображает все, что имеет альфa > 0.
- (UIImage *)tintedImageWithColor:(UIColor *)tintColor blendingMode:(CGBlendMode)blendMode highQuality:(BOOL) yerOrNo;
{
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);
if (yerOrNo) {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetShouldAntialias(context, true);
CGContextSetAllowsAntialiasing(context, true);
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
}
[tintColor setFill];
CGRect bounds = CGRectMake(0, 0, self.size.width, self.size.height);
UIRectFill(bounds);
[self drawInRect:bounds blendMode:blendMode alpha:1.0f];
if (blendMode != kCGBlendModeDestinationIn)
[self drawInRect:bounds blendMode:kCGBlendModeDestinationIn alpha:1.0];
UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return tintedImage;
}
Я нашел этот фрагмент в Интернете, но я не помню, где.
Ответ 3
Ссылаясь на комментарий выше.
Мой код:
button.backgroundColor = UIColor.withAlphaComponent(UIColor.white)(0.1)
button.layer.cornerRadius = button.frame.size.height / 2
button.layer.borderWidth = 3
button.layer.borderColor = UIColor.white.cgColor
button.layer.contents = UIImage(named: "buttonImage.png")?.cgImage
button.layer.contentsGravity = kCAGravityCenter
button.layer.magnificationFilter = kCAFilterLinear
button.layer.isGeometryFlipped = false
Применение решения:
let maskLayer = CALayer()
И наконец:
layer.backgroundColor = UIColor.redColor().CGColor
Результат ужасен.
Решение находится по ссылке ниже (ссылка в комментарии)
Но я показываю свой код (беру его из ссылки):
let image_ = UIImage(named: "image.png")
let maskImage = image_?.cgImage
let width = image_?.size.width
let height = image_?.size.height
let bounds = CGRect(x: 0, y: 0, width: width!, height: height!)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
let bitmapContext = CGContext(data: nil,
width: Int(width!),
height: Int(height!),
bitsPerComponent: 8,
bytesPerRow: 0,
space: colorSpace,
bitmapInfo: bitmapInfo.rawValue)
bitmapContext?.clip(to: bounds, mask: maskImage!)
bitmapContext?.setFillColor(UIColor.yellow.cgColor)
bitmapContext?.fill(bounds)
let cImage = bitmapContext?.makeImage()
let coloredImage = UIImage(cgImage: cImage!)
self.myUIButton.layer.contents = coloredImage.cgImage
Пожалуйста, позвольте мне сказать вам что-то (важно) Не играйте с:
Имя изображения "someImage.png" должно быть точно именем файла в папке проекта.