2016-04-21 17 views
8

Wie kehren Sie die Maskenebene für ein Etikett um? Ich habe einen textLabel, die ich als eine Maske für einen imageView verwenden, die ein beliebiges Bild enthält wie folgt:Reverse-Layer-Maske für Etikett

let image = UIImage(named: "someImage") 
let imageView = UIImageView(image: image!) 

let textLabel = UILabel() 
textLabel.frame = imageView.bounds 
textLabel.text = "Some text" 

imageView.layer.mask = textLabel.layer 
imageView.layer.masksToBounds = true 

Die oben macht den Text in textLabel eine Schriftfarbe des imageView wie in How to mask the layer of a view by the content of another view? haben.

Wie umkehren ich dies um so entfernen Sie den Text in textLabelvon der imageView?

Antwort

7

Machen eine Unterklasse von UILabel:

class InvertedMaskLabel: UILabel { 
    override func drawTextInRect(rect: CGRect) { 
     guard let gc = UIGraphicsGetCurrentContext() else { return } 
     CGContextSaveGState(gc) 
     UIColor.whiteColor().setFill() 
     UIRectFill(rect) 
     CGContextSetBlendMode(gc, .Clear) 
     super.drawTextInRect(rect) 
     CGContextRestoreGState(gc) 
    } 
} 

Diese Unterklasse füllt seine Grenzen mit einer lichtundurchlässigen Farbe (weiß in diesem Beispiel, aber nur die Alphakanal Sachen). Dann zeichnet es den Text mit dem Mischmodus Clear, der einfach alle Kanäle des Kontexts auf 0 zurückstellt, einschließlich des Alphakanals.

Spielplatz Demo:

let root = UIView(frame: CGRectMake(0, 0, 400, 400)) 
root.backgroundColor = .blueColor() 
XCPlaygroundPage.currentPage.liveView = root 

let image = UIImage(named: "Kaz-256.jpg") 
let imageView = UIImageView(image: image) 
root.addSubview(imageView) 

let label = InvertedMaskLabel() 
label.text = "Label" 
label.frame = imageView.bounds 
label.font = .systemFontOfSize(40) 
imageView.maskView = label 

Ergebnis:

demo of image transparency inside the label text