Как показать цветное изображение оттенка в 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" должно быть точно именем файла в папке проекта.