Tuyên bố từ chối trách nhiệm: Tôi đang viết bài này mà không cần kiểm tra, vì vậy hãy tha thứ cho tôi nếu tôi sai ở đây.
Bạn nên đạt được những gì bạn cần bằng hai bước sau:
Tạo một CATextLayer
với kích thước của tầm nhìn của bạn, thiết lập các backgroundColor
là hoàn toàn minh bạch và foregroundColor
được đục (bởi [UIColor colorWithWhite:0 alpha:1]
và [UIColor colorWithWhite:0 alpha:0]
. sau đó thiết lập các string
tài sản cho chuỗi bạn muốn render, font
và fontSize
, vv
đặt mặt nạ xem của bạn lớp để lớp này: myView.layer.mask = textLayer
. Bạn sẽ phải nhập QuartzCore
để truy cập vào CALayer
chế độ xem của mình.
Lưu ý rằng tôi có thể chuyển đổi giữa màu đục và trong suốt trong bước đầu tiên.
Chỉnh sửa: Thật vậy, Noah đã đúng. Để khắc phục điều này, tôi đã sử dụng CoreGraphics với chế độ hòa trộn kCGBlendModeDestinationOut
.
Thứ nhất, một cái nhìn mẫu cho thấy rằng nó thực sự hoạt động:
@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
Sau khi thêm này để điều khiển xem, bạn sẽ thấy một cái nhìn đằng sau TestView
nơi Hello!
được rút ra.
Tại sao công việc này:
Các chế độ hòa trộn được định nghĩa là R = D*(1 - Sa)
, có nghĩa là chúng ta cần giá trị alpha đối diện hơn trong lớp mask
tôi đề nghị trước đó. Do đó, tất cả những gì bạn cần làm là vẽ với màu đục và điều này sẽ bị trừ khỏi nội dung bạn đã vẽ trên chế độ xem trước đó.
Chỉ cần làm rõ bạn đang sử dụng Core Text để vẽ chứ không phải UILabels? – feliun
Vâng, đúng vậy. – barndog