UILabel でこれを直接行うことはできないと思います。私がしたことは、それをいくつかの部分に分解することでした:
ラベルの背景のみを描画する方法。このために、文字列から CGPathRef のコードを切り取って、文字列をパスに変換しました。次に、UILabel をサブクラス化し、次の drawRect を追加すると、適切な処理が行われました。
-(void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
// Convert the attributed text to a UIBezierPath
CGPathRef path = [self.attributedText createPath];
// Adjust the path bounds horizontally as requested by the view
CGRect bounds = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines];
CGAffineTransform xform = CGAffineTransformMakeTranslation(bounds.origin.x, bounds.origin.y);
// Adjust the path bounds vertically because it doesn't seem to be taken into account yet
bounds = CGPathGetBoundingBox(path);
xform = CGAffineTransformTranslate(xform, 0., (self.bounds.size.height - bounds.size.height) / 2.);
// Apply the transform to the path
path = CGPathCreateCopyByTransformingPath(path, &xform);
// Set colors, the fill color should be the background color because we're going
// to draw everything BUT the text, the text will be left clear.
CGContextSetFillColorWithColor(ctx, self.textColor.CGColor);
// Flip and offset things
CGContextScaleCTM(ctx, 1., -1.);
CGContextTranslateCTM(ctx, 0., 0. - self.bounds.size.height);
// Invert the path
CGContextAddRect(ctx, self.bounds);
CGContextAddPath(ctx, path);
CGContextDrawPath(ctx, kCGPathEOFill);
// Discard the path
CFRelease(path);
// Restore gstate
CGContextRestoreGState(ctx);
}
インターフェイスビルダーで UILabel を作成し、クラスを設定し、背景色をクリアに設定し、前景色を提案された塗りつぶし色に設定すると、背景がテキストの場所から透けて見えます。
ラベルを通して表示されるボディをぼかすために、ラベルの下に FXBlurView ( https://github.com/nicklockwood/FXBlurView ) をドロップし、それらの位置合わせを維持するためのサイズ制限を設定しました。
https://github.com/dwb357/TransparentLabelですべての動作を確認できます。