2014-11-17 18 views
9

Ich muss ein farbiges Bild in CALayer zeigen.Wie zeige ich ein farbiges Bild in CALayer auf iOS?

Es funktioniert für UIImageView:

imageView.image = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) 

Aber CALayer zeigt das Bild mit seiner ursprünglichen Farbe und nicht die Tönungsfarbe.

let tintedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) 
layer.contents = tintedImage.CGImage 

Gibt es eine Möglichkeit auch gefärbtes Bild in CALayer zu zeigen?

Demo:

https://github.com/exchangegroup/calayer-with-tint-colored-image

enter image description here

Antwort

18

ich glaube, meine Lösung weit weniger umständlich ist:

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

lassen Sie mich wissen, ob es in Ordnung :)

+1

viel einfacher und sauberer als die angenommene Antwort. Vielleicht möchten Sie es vollständiger machen, indem Sie level layer = CALayer() hinzufügen und layer.frame einstellen. –

+0

Nicht für mich arbeiten. Dann schreibe meinen Code: – Markus

3

I arbeitet denke, das ist auf OSX mit dem Filter möglich Eigentum von CALayer, aber in ios wird nicht benutzt. Ich glaube, Sie das Bild neu zeichnen soll, total, hier ist ein Beispielcode, es tönt alles, was alpha hat> 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; 
} 

ich diesen Schnipsel im Internet gefunden habe, aber ich weiß nicht mehr wo.

-1

Mit Bezug auf den obigen Kommentar.

Mein Code:

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 

Anwendung der Lösung:

let maskLayer = CALayer() 

Und schließlich:

layer.backgroundColor = UIColor.redColor().CGColor 

Das Ergebnis ist schrecklich.

Die Lösung ist auf den unten stehenden Link (Link im Kommentar)

Aber ich zeige meinen Code (nehmen Sie es von Link):

  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 

Bitte, lassen Sie mich Ihnen etwas sagen (ist wichtig) spielen Sie nicht mit:

Der Bildname "someImage.png" muss genau der Dateiname in Ihrem Projektordner sein.

+0

Ich fand die Lösung und es funktioniert für mich (fast für mich) Ich habe den Link angehängt: https: // stackoverflow.com/Fragen/31803157/how-to-Farbe-a-uiimage-in-swift/31803460 # 31803460 – Markus

Verwandte Themen