在不使用UILabel的情况下,在drawRect:方法中为NSString文本添加投影

idS*_*tar 22 nsstring uiview drawrect dropshadow ios

我想为使用iOS提供的NSString (UIStringDrawing)类别方法绘制的文本添加阴影:

- (CGSize)drawAtPoint:(CGPoint)point forWidth:(CGFloat)width 
             withFont:(UIFont *)font minFontSize:(CGFloat)minFontSize 
       actualFontSize:(CGFloat *)actualFontSize 
        lineBreakMode:(UILineBreakMode)lineBreakMode
   baselineAdjustment:(UIBaselineAdjustment)baselineAdjustment; 
Run Code Online (Sandbox Code Playgroud)

显然,没有投影选项.

是的,可以在这里使用UILabel并获得设置的阴影属性,但这不会像性能一样,因为任何UIView子类(例如UILabel)都会包装CALayer对象并且会更重(性能明智).

这是上下文:

我正在为UITableViewCell子类做自定义绘图,drawRect:在表格单元视图上实现,而不是从合成的UIView子类的Nib文件创建表格单元格.

合成一堆UIView子类会破坏尝试保持这种精简并在表视图滚动性能中保持在每秒50-60帧内的目的.

我尝试过轻微的偏移两次绘制字符串.一旦我调整了我要去的单元格的背景颜色上的投影颜色,这可能会变得可以接受,但它似乎相当笨拙.当然没有像UILabel那样的阴影模糊属性.

我搜索了解决方案,他们或者推荐UILabel使用(我上面已经解雇了,因为我有十几个不同的文本元素被合成到表格单元格视图)或者CGContextSetShadow().后者似乎总是在矩形形状的上下文中提出,并且不一定用于将阴影附加到直接使用上述NSString drawAtPoint...方法绘制的文本的路径.(我确实尝试过,但它似乎没有用(即没有改变);我是Core Graphics绘图的新手).

建议?

Ole*_*ann 40

它适用于我CGContextSetShadow().例:

- (void)drawRect:(CGRect)rect 
{
    NSString *string = @"Hello World!";

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetShadow(context, CGSizeMake(20.0f, 20.0f), 10.0f);

    [string drawAtPoint:CGPointMake(100.0f, 100.0f) withFont:[UIFont boldSystemFontOfSize:36.0f]];
}
Run Code Online (Sandbox Code Playgroud)

  • 优秀.谢谢Ole!之前,我认为我的模糊值太高,偏移量只有(1,1),所以我看不到它生效了.由于我是新手,我接下来的挑战是为后续绘图关闭阴影效果(我真的需要系统地阅读Quartz 2D指南).但是,在设置阴影效果之前使用"CGContextSaveGState(context)"并且在NSString完成它的绘制之后使用"CGContextRestoreGState(context)"时,我取得了很好的成功.我已经准备好了! (3认同)