【问题标题】:How to show tint colored image in CALayer on iOS?如何在 iOS 上的 CALayer 中显示色调彩色图像?
【发布时间】:2015-01-14 23:36:20
【问题描述】:

我需要在 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

【问题讨论】:

    标签: ios uiimage calayer


    【解决方案1】:

    我认为我的解决方案要简单得多:

    let maskLayer = CALayer()
    maskLayer.frame = layer.bounds
    maskLayer.contents = tintedImage.CGImage
    layer.mask = maskLayer
    layer.backgroundColor = UIColor.redColor().CGColor
    

    让我知道它是否工作正常:)

    【讨论】:

    • 比公认的答案更容易、更整洁。您可能希望通过添加 let layer = CALayer() 并设置 layer.frame 来使其更完整。
    【解决方案2】:

    我想在 OSX 上使用 CALayer 的 filter 属性是可能的,但在 ios 中没有使用。 我认为你应该完全重绘图像,这是一个示例代码,它会为所有 alpha > 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;
    }
    

    我在互联网上找到了这个 sn-p,但我不记得在哪里。

    【讨论】:

      【解决方案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
      

      请让我告诉你一些事情(很重要)不要玩:

      • image@2x.png
      • 或image@3x.png

      图像名称“someImage.png”必须与项目文件夹中的文件名完全相同。

      【讨论】:

      【解决方案4】:

      根据 J.Williams 的答案添加答案 - 但使用系统映像针对 Swift 5 进行了更新。包括所有图层设置等。希望这很有用! (注意:我认为我们不能只更改图层中 UIImage 上的色调而不跳过很多像这样的疯狂箍,这很荒谬)

          let image = UIImage(systemName: "plus.circle.fill")
          let circleLayer = CAShapeLayer()
          let circleDiameter: CGFloat = 20.0
          circleLayer.frame = CGRect(x: x - (circleDiameter / 2),
                                     y: y - (circleDiameter / 2),
                                     width: circleDiameter, height: circleDiameter)
          let maskLayer = CALayer()
          maskLayer.frame = circleLayer.bounds
          maskLayer.contents = image?.cgImage
          circleLayer.mask = maskLayer
          circleLayer.backgroundColor = UIColor.systemPurple.cgColor
          myView.layer.addSublayer(circleLayer)
      

      【讨论】:

        猜你喜欢
        • 2015-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        • 2012-05-21
        • 2015-05-28
        • 2023-03-23
        • 2012-07-26
        相关资源
        最近更新 更多