Yasal Uyarı: Bunu test etmeden yazıyorum, bu yüzden burada yanılıyorsam beni affet.
Sen bu iki basamakla gerekenleri başarmak olmalıdır:
sizin bakış boyutu ile bir CATextLayer
oluşturma [UIColor colorWithWhite:0 alpha:1]
ve [UIColor colorWithWhite:0 alpha:0]
tarafından (tamamen şeffaf olmak backgroundColor
kurmak ve foregroundColor
opak olması. Sonra işlemek istediğiniz dizeye string
özelliğini ayarlayın, font
ve fontSize
vb
Bu katman için görünümünüzün katmanın maske ayarlayın: myView.layer.mask = textLayer
. Görünümünüzün CALayer
numarasına erişmek için QuartzCore
'u içe aktarmanız gerekir.
İlk adımda opak ve saydam renk arasında geçiş yapılabileceğini unutmayın.
Düzeltme: Gerçekten de, Noah haklıydı. Bunu aşmak için CoreGraphics'i kCGBlendModeDestinationOut
karışım modunu kullanarak kullandım.
Birincisi, gerçekten çalıştığını gösteren bir örnek görünüm:
@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
görünümünüzü kontrolöre bu ekledikten sonra, Hello!
çekilir TestView
arkasında görünümünü görürsünüz.
bu işi yapar Neden:
karıştırma modu biz daha önce önerilen mask
katmanda daha zıt alfa değerlerini ihtiyaç anlamına R = D*(1 - Sa)
olarak tanımlanır. Bu nedenle, yapmanız gereken tek şey, opak bir renkle çizmektir ve bu, önceden çizdiğiniz nesnelerden çıkarılacaktır.
UILabels'i çizmek için değil, Çekirdek Metni kullandığınızı açıklığa kavuşturmak ister misiniz? – feliun
Evet, doğru. – barndog