使用NSString UIKit添加时,是否可以使用简单的文本阴影进行绘制?我的意思是没有编写代码以两种颜色绘制两次,可以使用各种UIKit类(如UILabel及其shadowColor
和shadowOffset
属性),也可以通过{{1}无需实际模糊阴影(这必然要贵得多)。
Apple's doc for these extensions实际上包含常量(在最底部),包括CGContextSetShadow
和UITextAttributeTextShadowColor
,这意味着它是可能的,但我认为在实际中没有任何可能的用法方法
答案 0 :(得分:30)
有几点想法:
UITextAttributeTextShadow...
键适用于使用文本属性字典,例如UIAppearance
方法:
NSDictionary *attributes = @{UITextAttributeTextShadowColor : [UIColor blackColor],
UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake(2.0, 0.0)],
UITextAttributeTextColor : [UIColor yellowColor]};
[[UINavigationBar appearance] setTitleTextAttributes:attributes];
UITextAttributeTextShadow...
键仅适用于接受文本属性字典的方法。
绘制文本字符串时最接近的等效键是使用带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
的底线消除了贝塞尔生成阴影的大部分(如果不是全部)计算开销。
仅供参考,我通过将0.0
值设置为blur
0.0
来体验类似的效果提升,就像我对上面的归因文本再现一样。
最重要的是,只要你使用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似乎将这些属性视为一种特殊情况。