19

在 iOS7 CGContextSelectFont 已被弃用。弃用消息说我必须使用 Core Text,但我不知道哪个是这段代码的确切等价物:

CGContextSelectFont(context, "Helvetica", kBarLabelSize, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetRGBFillColor(context, 0, 0, 0, 1.0);
CGContextSetTextMatrix (context, CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0));
CGContextShowTextAtPoint(context, barX, barY, [@"Some text" cStringUsingEncoding:NSUTF8StringEncoding], [barValue length]);

我已经能够使用以下代码创建字体:

CFMutableAttributedStringRef attrStr = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica"), kBarLabelSize, NULL);
CFAttributedStringSetAttribute(attrStr, CFRangeMake(0, CFAttributedStringGetLength(attrStr)), kCTFontAttributeName, font);

但是现在我怎样才能将具有这种字体的文本“绘制”到上下文中呢?

4

3 回答 3

26

尽我所能从您的代码中理解,确切的等价物是:

CGContextSetTextDrawingMode(context, kCGTextFill); // This is the default
[[UIColor blackColor] setFill]; // This is the default
[@"Some text" drawAtPoint:CGPointMake(barX, barY)
           withAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Helvetica"
                                                                size:kBarLabelSize]
                            }];

请注意,您对CGContextSetTextDrawingMode和的调用CGContextSetRGBFillColor将值设置为默认值。CGContextSetTextMatrix像这样使用 UIKit 绘图时不需要调用。

然而,我不知道[barValue length]这里有什么。我假设您只是错误地将其用于@"Some text". (length不是您需要的字节数。您可能的意思是[barValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding])。

请注意,UIKit 字符串绘图(见此处)包装了核心文本。

于 2013-09-24T03:38:50.847 回答
11

我发现,至少在我的情况下,新的 NSString.drawAtPoint 接口的问题在于它可能会颠倒绘制,这取决于您使用上下文的方式。

另一种方法是使用 Core Text 方法,特别是 CTLine 接口:

NSDictionary *attribs = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:14.0]};

NSAttributedString *fontStr = [[NSAttributedString alloc] initWithString:@"some text" attributes:attribs];

CTLineRef displayLine = CTLineCreateWithAttributedString( (__bridge CFAttributedStringRef)fontStr );
CGContextSetTextPosition( ctx, xPosition, yPosition );
CTLineDraw( displayLine, ctx );
CFRelease( displayLine );
于 2013-10-04T21:23:09.533 回答
0

您可能可以使用以下内容来替换它。

  1. CGContextSetFont
  2. CGContextSetFontSize
于 2013-09-23T23:53:48.450 回答