我想在UIView上的子类上绘制文本,以便将文本从形状和视图背后的背景中删除,就像在OSX Mavericks标识找到的
here中一样.
我会说,我更像是一个中级/早期的高级iOS开发人员,所以我可以自由地向我提出一些疯狂的解决方案.我希望我必须重写drawRect才能做到这一点.
多谢你们!
编辑:
我应该提到,我的第一次尝试是使文本[UIColor clearColor]不起作用,因为只是将文本的alpha组件设置为0,这只是通过文本显示视图.
解决方法
免责声明:我在写这个没有测试,所以原谅我,如果我错了这里.
你应该通过这两个步骤实现你所需要的:
>使用视图的大小创建一个CATextLayer,将backgroundColor设置为完全透明,并将foregroundColor设置为不透明(通过[UIColor colorWithWhite:0 alpha:1]和[UIColor colorWithWhite:0 alpha:0]),然后设置字符串属性到要渲染的字符串,字体和fontSize等
>将视图的图层的蒙版设置为此图层:myView.layer.mask = textLayer.您必须导入QuartzCore才能访问您的视图的CALayer.
请注意,我可能在第一步中在不透明和透明颜色之间切换.
编辑:的确,诺亚是对的.为了克服这个问题,我使用了CoreGraphics与kCGBlendModeDestinationOut混合模式.
首先,显示它确实有效的示例视图:
@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
将其添加到您的视图控制器后,您将看到TestView后面的视图,您好!被绘制
为什么这样做:
混合模式被定义为R = D *(1-Sa),这意味着我们需要与之前建议的掩模层相反的α值.因此,您所需要做的就是用不透明的颜色进行绘制,这将从预先在视图中绘制的东西中减去.