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

时间:2013-06-16 00:14:34

标签: ios uikit

使用NSString UIKit添加时,是否可以使用简单的文本阴影进行绘制?我的意思是没有编写代码以两种颜色绘制两次,可以使用各种UIKit类(如UILabel及其shadowColorshadowOffset属性),也可以通过{{1}无需实际模糊阴影(这必然要贵得多)。

Apple's doc for these extensions实际上包含常量(在最底部),包括CGContextSetShadowUITextAttributeTextShadowColor,这意味着它是可能的,但我认为在实际中没有任何可能的用法方法

2 个答案:

答案 0 :(得分: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上使用shadowBlurRadius 10.0的复杂多行文本的旋转动画实现了31 fps的帧速率,但将shadowBlurRadius更改为{{1产生60帧/秒的帧速率。

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

  3. 仅供参考,我通过将0.0值设置为blur 0.0来体验类似的效果提升,就像我对上面的归因文本再现一样。

  4. 最重要的是,只要你使用CGContextSetShadow的模糊半径,我认为你不应该担心基于bezier的阴影的计算开销。如果你自己写两次文本,一次为阴影和再次为前景色,我会不会感到惊讶,甚至可能会更有效率,但我不确定差异是否可以观察到。但我不知道有任何API调用可以帮助您(0.0 CGContextSetShadow blur除外{。}}。

答案 1 :(得分: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似乎将这些属性视为一种特殊情况。