CTFrameDraw()忽略NSObliquenessAttributeName

时间:2014-10-21 02:56:43

标签: drawrect nsattributedstring cgcontext core-text ctframe

有些奇怪的事情正在发生。我正在使用NSAttributedString进行一些格式化,包括斜面和倾斜。 NSObliquenessAttributeName完成了这个伎俩。但后来我想扩展到CoreText来控制文本实际渲染的帧。甚至在搞清楚之前,我注意到我的NSObliquenessAttributeName没有被渲染。我的所有其他属性仍然呈现,所以我有点困惑。

- (void)drawSlanted
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSaveGState(context);

    [[UIColor blackColor] setFill];

    NSAttributedString *text = [[NSAttributedString alloc] initWithString:@"This isn't slanted... but is stroked" attributes:@{NSObliquenessAttributeName: @10.0,
                                                                                                                               NSStrokeWidthAttributeName: @2.0}];

    // Flip Coordinates
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0.0, CGRectGetHeight(self.bounds));
    CGContextScaleCTM(context, 1.0, -1.0);

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)text);
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, text.length), [UIBezierPath bezierPathWithRect:self.bounds].CGPath, NULL);

    CTFrameDraw(frame, context);

    CFRelease(frame);

    CGContextRestoreGState(context);
}

1 个答案:

答案 0 :(得分:1)

在某种意义上,NSAttributedString支持任意属性。也就是说,您可以在属性字典中放置您喜欢的任何属性键值对,NSAttributedString将尽职地为您存储它。这包括你组成的属性。

但是,NSAttributedString将不会使用它不能理解的属性来格式化或布置字符串。它只了解Cocoa的预定义属性。

Core Text也是如此。它只了解某些属性。不幸的是,Core Text理解的属性集与Cocoa和NSAttributedString理解的集合不同。核心文本理解的集合记录在Core Text String Attributes Reference中。它不包含倾斜属性。

我不确定,但我认为你需要使用用变换矩阵创建的字体来获得倾斜的字形。 (当然,除非你有理由不这样做,否则你应该更喜欢斜体。)