這裏有一個技術,它類似於馬特·加拉格爾的,這將產生帶圖像的倒置文本遮罩。
分配一個(可變的)數據緩衝區。使用8位Alpha通道創建位圖上下文。配置文本繪圖的設置。在複製模式下填充整個緩衝區(默認顏色被假定爲alpha值爲1)。以清晰模式寫入文本(alpha值爲0)。從位圖上下文創建一個圖像。使用位圖作爲掩碼從源圖像創建新圖像。創建一個新的UIImage並清理。
每當textString或sourceImage或size值發生變化時,重新生成最終圖像。
CGSize size = /* assume this exists */;
UIImage *sourceImage = /* assume this exists */;
NSString *textString = /* assume this exists */;
char *text = [textString cStringUsingEncoding:NSMacOSRomanStringEncoding];
NSUInteger len = [textString lengthOfBytesUsingEncoding:cStringUsingEncoding:NSMacOSRomanStringEncoding];
NSMutableData *data = [NSMutableData dataWithLength:size.width*size.height*1];
CGContextRef context = CGBitmapContextCreate([data mutableBytes], size.width, size.height, 8, size.width, NULL, kCGImageAlphaOnly);
CGContextSelectFont(context, "Gill Sans Bold", 64.0f, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGContextFillRect(context, overlay.bounds);
CGContextSetBlendMode(context, kCGBlendModeClear);
CGContextShowTextAtPoint(context, 16.0f, 16.0f, text, len);
CGImageRef textImage = CGBitmapContextCreateImage(context);
CGImageRef newImage = CGImageCreateWithMask(sourceImage.CGImage, textImage);
UIImage *finalImage = [UIImage imageWithCGImage:newImage];
CGContextRelease(context);
CFRelease(newImage);
CFRelease(textImage);
另一種方法是將textImage放入一個新圖層並在視圖的圖層上設置該圖層。 (刪除打造「newImage」和「finalImage」的臺詞。)假設出現這種情況你的看法的地方里面的代碼:
CALayer *maskLayer = [[CALayer alloc] init];
CGPoint position = CGPointZero;
// layout the new layer
position = overlay.layer.position;
position.y *= 0.5f;
maskLayer.bounds = overlay.layer.bounds;
maskLayer.position = position;
maskLayer.contents = (__bridge id)textImage;
self.layer.mask = maskLayer;
有更多的選擇,有些人可能會更好(子類的UIImage並直接明確繪製文本超類完成繪製後的模式?)。
到目前爲止,從潛水進一步進入激動人心的石英文檔,我相信我需要使用'CGContextSetTextDrawingMode'和'kCGTextClip' – runmad 2012-01-04 03:12:00
見我的回答http://stackoverflow.com/questions/19787238/transparent- uilabel -textcolor-on-superview-superview-sort-of爲基於路徑的方法來解決這個問題。 – 2014-02-19 21:27:02