Ios7 CGContextShowGlyphsAtPoint已弃用

Ios7 CGContextShowGlyphsAtPoint已弃用,ios7,fonts,drawrect,core-text,uifont,Ios7,Fonts,Drawrect,Core Text,Uifont,花了相当多的时间在iPhone应用程序中显示“泰语拼音YK”字体。我终于把事情解决了,开始工作了 尽管它正在运行,但编译器仍然抱怨(警告)我的类执行显示的(void)drawRect:方法中有一行代码 CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, textLength); 编译器告诉我此代码已弃用。我的问题是“我应该如何改变它?”。 尽管我在网上搜索答案,但没有找到任何明确的答案。 文档中提到了类似“使用核心文本”的内容,这一

花了相当多的时间在iPhone应用程序中显示“泰语拼音YK”字体。我终于把事情解决了,开始工作了

尽管它正在运行,但编译器仍然抱怨(警告)我的类执行显示的(void)drawRect:方法中有一行代码

CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, textLength);
编译器告诉我此代码已弃用。我的问题是“我应该如何改变它?”。 尽管我在网上搜索答案,但没有找到任何明确的答案。 文档中提到了类似“使用核心文本”的内容,这一内容过于模糊,无法作为答案。

核心图形:

void CGContextShowGlyphsAtPoint (
   CGContextRef context,
   CGFloat x,
   CGFloat y,
   const CGGlyph glyphs[],
   size_t count
);
核心文本:

void CTFontDrawGlyphs (
   CTFontRef font,
   const CGGlyph glyphs[],
   const CGPoint positions[],
   size_t count,
   CGContextRef context
);
核心文本版本需要CTFontRef(在核心图形版本中,字体应在上下文中设置)

您可以从UIFont获取CTFontRef:

    CTFontRef ctFont = CTFontCreateWithName( (__bridge CFStringRef)uiFont.fontName, uiFont.pointSize, NULL);
CT版本还需要一组点,每个标志符号对应一个点。假设您使用CG代码绘制一个glyph,您可以创建如下数组:

        CGPoint point = CGPointMake(x, y);
        const CGPoint* positions = &point;
此更改确实意味着您将需要每个图示符的点位置。在我的例子中,额外的工作是最小的:我一次推进排字机一个字符(对于曲线文本),所以我无论如何都要做这个计算

您可以使用CTRun一次打印一个文本:

  void CTRunDraw ( 
      CTRunRef run, 
      CGContextRef context, 
      CFRange range );    
这样可以省去迭代每个glyph的麻烦。你可以像这样用它

CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CTLineRef line = CTLineCreateWithAttributedString(
      (__bridge CFTypeRef)self.attributedString);

  CFArrayRef runs = CTLineGetGlyphRuns(line);
  CFIndex runCount = CFArrayGetCount(runs);
  for (CFIndex runIndex = 0; runIndex < runCount; ++runIndex) {
      CTRunRef run = CFArrayGetValueAtIndex(runs, runIndex);
      [self adjustContextForRun:run];
       CTRunDraw (run, context, 0)
 }
我不知道这种抽象级别是否适用于您的情况(我只习惯于使用拉丁字体),但知道它的存在是值得的,可以省去很多低级的麻烦

可以使用以下命令设置文本的初始图形位置:

 void CGContextSetTextPosition ( 
    CGContextRef c, 
    CGFloat x, 
    CGFloat y );
 void CGContextSetTextPosition ( 
    CGContextRef c, 
    CGFloat x, 
    CGFloat y );