14

使用 NSString UIKit 添加时是否可以使用简单的文本阴影进行绘制?我的意思是无需编写代码以两种颜色绘制两次,这可以通过各种 UIKit 类(例如 UILabel 及其shadowColorshadowOffset属性)来完成,也无需通过实际的模糊阴影CGContextSetShadow(这肯定会更昂贵)。

Apple 的这些扩展的文档实际上包括常量(在最底部),包括UITextAttributeTextShadowColor并且UITextAttributeTextShadowOffset这意味着它是可能的,但我在实际方法中看不到这些的任何可能用法。

4

2 回答 2

30

几个想法:

  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. 绘制文本字符串时最接近的等效键是使用带有NSShadowAttributeName键的属性字符串:

    - (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];
    }
    

    但是,如果您担心能够进行贝塞尔曲线阴影的阴影算法的性能影响,NSShadow则可能会受到影响。但是做一些基准测试,改变会shadowBlurRadius极大地影响性能。例如,在速度较慢的 iPhone 3GS 上使用 ashadowBlurRadius为复杂的多行文本的旋转设置动画可实现 31 fps 的帧速率,但改为产生 60 fps 的帧速率。10.0shadowBlurRadius0.0

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

  3. blur仅供参考,通过将值设置为0.0for ,我体验到了类似的性能改进CGContextSetShadow,就像我在上面的属性文本再现中所经历的那样。

底线,我不认为你应该担心基于贝塞尔阴影的计算开销,只要你使用0.0. 如果你自己写两次文本,一次用于阴影,一次用于前景色,我不会感到惊讶,甚至可能更有效,但我不确定是否可以观察到差异。但我不知道有任何 API 调用可以为你做到这一点(除了CGContextSetShadowwith blurof 0.0)。

于 2013-06-16T12:58:19.823 回答
2

以下代码片段使用 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 似乎将这些属性视为特殊情况。

于 2013-06-16T03:52:33.063 回答