是否可以使用NSString UIKit添加阴影绘制文本?

使用NSString UIKit添加时,是否可以使用简单的文本阴影进行绘制? 我的意思是没有编写代码来绘制两种颜色的两种颜色,可以使用各种UIKit类,如UILabel和它的shadowColorshadowOffset属性,也没有通过CGContextSetShadow (它将被昂贵得多)做实际的模糊阴影。

苹果公司的这些扩展文件实际上包括常量(在底部),包括UITextAttributeTextShadowColorUITextAttributeTextShadowOffset ,这意味着这是可能的,但我没有看到这些实际方法中的任何可能的用法。

一些想法:

  1. UITextAttributeTextShadow...键用于在使用文本属性字典时使用例如UIAppearance方法:

     NSDictionary *attributes = @{UITextAttributeTextShadowColor : [UIColor blackColor], UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake(2.0, 0.0)], UITextAttributeTextColor : [UIColor yellowColor]}; [[UINavigationBar appearance] setTitleTextAttributes:attributes]; 

    UITextAttributeTextShadow...键仅用于接受文本属性字典的方法中。

  2. 绘制文本string时最接近的等效键是使用NSShadowAttributeName键的属性string:

     - (void)drawRect:(CGRect)rect { UIFont *font = [UIFont systemFontOfSize:50]; NSShadow *shadow = [[NSShadow alloc] init]; shadow.shadowColor = [UIColor blackColor]; shadow.shadowBlurRadius = 0.0; shadow.shadowOffset = CGSizeMake(0.0, 2.0); NSDictionary *attributes = @{NSShadowAttributeName : shadow, NSForegroundColorAttributeName : [UIColor yellowColor], NSFontAttributeName : font}; NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:@"this has shadows" attributes:attributes]; [attributedText drawInRect:rect]; } 

    如果你担心阴影algorithm能够做一个NSShadow曲线阴影的性能打击,但是, NSShadow可能会因此受到影响。 但是做一些基准testing,改变shadowBlurRadius显着影响性能。 例如,在缓慢的iPhone 3GS上使用shadowBlurRadius10.0animation旋转复杂的多行文本,实现了31 fps的帧速率,但将shadowBlurRadius更改为0.0 ,则帧速率为60 fps。

    底线,使用0.0的阴影模糊半径消除了贝塞尔生成阴影的大部分(如果不是全部)计算开销。

  3. 仅供参考,通过将CGContextSetShadowblur值设置为0.0 ,我体验到类似的性能改进,就像我对上面的归属文本再现经验一样。

底线,只要你使用0.0的模糊半径,我不认为你应该担心基于贝塞尔的阴影的计算开销。 如果你自己写了两次,一次是阴影,一次是前景色,可能会更有效一些,但我不确定这种差别是否可以观察。 但是我不知道任何会为你做的API调用( CGContextSetShadow除外, blur0.0 )。

以下片段使用CALayer在UILabel中的字符边缘添加阴影:

  _helloLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)]; [_helloLabel setBackgroundColor:[UIColor clearColor]]; [_helloLabel setTextColor:[UIColor whiteColor]]; [_helloLabel setTextAlignment:NSTextAlignmentCenter]; [_helloLabel setFont:[UIFont lightApplicationFontOfSize:30]]; _helloLabel.layer.shadowColor = UIColorFromRGB(0xd04942).CGColor; _helloLabel.layer.shadowOffset = CGSizeMake(0, 0); _helloLabel.layer.shadowRadius = 2.0; _helloLabel.layer.shadowOpacity = 1.0; [self addSubview:_helloLabel]; 

。 。 通常这会在边界周围增加阴影,但UILabel似乎将这些属性视为一种特殊情况。