Dưới đây là một kỹ thuật mà là tương tự như Matt Gallagher, mà sẽ tạo ra một mặt nạ văn bản ngược với một hình ảnh.
Phân bổ bộ đệm dữ liệu (có thể thay đổi). Tạo ngữ cảnh bitmap với kênh alpha 8 bit. Định cấu hình cài đặt cho bản vẽ văn bản. Điền toàn bộ bộ đệm trong chế độ sao chép (màu mặc định được giả định có giá trị alpha là 1). Viết văn bản ở chế độ rõ ràng (giá trị alpha là 0). Tạo một hình ảnh từ ngữ cảnh bitmap. Sử dụng bitmap làm mặt nạ để tạo hình ảnh mới từ hình ảnh nguồn. Tạo UIImage mới và dọn dẹp.
Mỗi lần giá trị textString hoặc sourceImage hoặc kích thước thay đổi, hãy tạo lại hình ảnh cuối cùng.
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);
Một cách khác để thực hiện việc này là đưa textImage vào một lớp mới và đặt lớp đó trên lớp của chế độ xem của bạn. (Tháo dòng mà tạo ra "newImage" và "finalImage".) Giả sử điều này xảy ra bên trong xem của bạn đang ở đâu đó:
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;
Có nhiều lựa chọn thay thế, một số có thể được tốt hơn (phân lớp UIImage và vẽ các văn bản trực tiếp trong rõ ràng chế độ sau khi siêu lớp đã thực hiện bản vẽ của nó?).
Cho đến nay, từ lặn sâu hơn vào các tài liệu thạch anh thú vị, tôi tin rằng tôi cần phải sử dụng 'CGContextSetTextDrawingMode' và 'kCGTextClip' – runmad
Xem câu trả lời của tôi để http://stackoverflow.com/questions/19787238/transparent- uilabel-textcolor-on-superview-superview-sắp xếp-cho một cách tiếp cận dựa trên đường dẫn đến vấn đề này. –