CATextLayer字体borderColor?

时间:2012-01-02 15:49:28

标签: iphone objective-c ios ipad calayer

我希望我的文字被白色边框包围。我正在使用CATextLayer作为文本。我知道CATextLayer没有属性borderColor / borderWidth。当然我可以使用它的超类(CALayer)的属性,但是它会在图层的框架周围绘制边框而不是文本本身。有人知道如何使用CATextLayer实现这一目标吗?

enter image description here

2 个答案:

答案 0 :(得分:5)

以防万一有人对我的解决方案感兴趣:

基本上可以直接使用笔划(边框)创建文本而不使用CoreText。 CATextLayer的字符串属性接受NSAttributedStrings。因此,它就像给NSAttributedString一样简单,它的属性中包含笔触颜色和笔触宽度。

不幸的是我需要设置字体大小的动画。 string属性是可动画的,但前提是它是NSString。所以我决定继承CATextLayer。经过多次尝试后,我意识到CATextLayer的字符串和内容属性是互斥的,这意味着要么显示字符串,要么显示内容。我自己无法弄清楚如何绘制字符串。只有在更新内容时才会调用display和drawInContext:ctx方法,但我不知道在更新字符串时我需要调用什么。

所以我决定编写自己的CATextLayer类,继承CA​​Layer。我创建了一个名为fontSize的动画属性。当这个动画时,调用drawInContext:ctx方法。在drawInContext:ctx方法中,我使用CoreText创建一个新字符串,并使用fontSize属性相应地更新其大小。

答案 1 :(得分:3)

对于任何对解决方案感兴趣的人,无需担心动画字体大小:

@import QuartzCore;
@import CoreText;

- (void)addTextLayer
{
   NSDictionary* attributes = @{ NSFontAttributeName : [UIFont boldSystemFontOfSize:40.0],
                                 (NSString*)kCTForegroundColorAttributeName: (id)[UIColor blackColor].CGColor,
                                 (NSString*)kCTStrokeWidthAttributeName: @(-2.0),
                                 (NSString*)kCTStrokeColorAttributeName: (id)[UIColor whiteColor].CGColor };
   CATextLayer* textLayer = [CATextLayer layer];
   textLayer.string = [[NSAttributedString alloc] initWithString:@"Hello World" attributes:attributes];

   // Do the rest...
}