How do you reverse the mask layer for a label? I have a textLabel
, which I use as a mask for an imageView
that contains an arbitrary image as follows:
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
The above makes the text in textLabel
have a font colour of the imageView
as in How to mask the layer of a view by the content of another view?.
How do I reverse this so as to remove the text in textLabel
from the imageView
?
1 Answers
Answers 1
Make a subclass of 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) } }
This subclass fills its bounds with an opaque color (white in this example, but only the alpha channel matters). Then it draws the text using the Clear
blend mode, which simply sets all channels of the context back to 0, including the alpha channel.
Playground 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
Result:
0 comments:
Post a Comment