免責事項: 私はテストせずにこれを書いているので、ここで間違っている場合はご容赦ください。
次の 2 つの手順で必要なものを達成する必要があります。
CATextLayer
ビューのサイズで を作成し、をbackgroundColor
完全に透明にforegroundColor
して不透明に設定します ([UIColor colorWithWhite:0 alpha:1]
と を使用) [UIColor colorWithWhite:0 alpha:0]
。次に、プロパティをレンダリングする文字列に設定しstring
ます。font
fontSize
ビューのレイヤーのマスクをこのレイヤーに設定します: myView.layer.mask = textLayer
. QuartzCore
ビューの にアクセスするには、インポートする必要がCALayer
あります。
最初のステップで不透明色と透明色を切り替えた可能性があることに注意してください。
編集:確かに、ノアは正しかった。これを克服するために、kCGBlendModeDestinationOut
ブレンド モードで CoreGraphics を使用しました。
まず、実際に機能することを示すサンプル ビュー:
@implementation TestView
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor clearColor];
}
return self;
}
- (void)drawRect:(CGRect)rect {
[[UIColor redColor] setFill];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:10];
[path fill];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context); {
CGContextSetBlendMode(context, kCGBlendModeDestinationOut);
[@"Hello!" drawAtPoint:CGPointZero withFont:[UIFont systemFontOfSize:24]];
} CGContextRestoreGState(context);
}
@end
TestView
これをView Controllerに追加すると、描画された場所の背後にあるビューが表示さHello!
れます。
なぜこれが機能するのですか:
ブレンド モードは として定義されています。これは、先ほど提案したレイヤーとはR = D*(1 - Sa)
反対のアルファ値が必要であることを意味します。mask
したがって、不透明な色で描画するだけで、事前にビューに描画したものから差し引かれます。