如何在iPhone上使用Quartz显示文本?

7
我一直在尝试使用Quartz上下文来显示文本,但无论我尝试什么方法,我都没有成功地让文本显示出来(虽然我能够显示各种其他的Quartz对象)。有人知道我可能做错了什么吗?
-(void)drawRect:(CGRect)rect
{   
  // Drawing code
  CGContextRef  context = UIGraphicsGetCurrentContext();
  CGContextSelectFont(context, "Arial", 24, kCGEncodingFontSpecific);
  CGContextSetTextPosition(context,80,80);
  CGContextShowText(context, "hello", 6);
  //not even this works
  CGContextShowTextAtPoint(context, 1,1, "hello", 6);
}    
2个回答

9

好的,我明白了。首先,将编码模式更改为kCGEncodingMacRoman。其次,在此下方插入以下行:

CGContextSetTextMatrix(canvas, CGAffineTransformMake(1, 0, 0, -1, 0, 0));

这将设置文本的转换矩阵,以便正确绘制。如果您没有添加此行,则文本将颠倒并反向显示。不知道为什么这不是默认设置。最后,请确保您已设置正确的填充颜色。如果您忘记从背景颜色更改为文本颜色并最终得到白色文本,那么这是一个容易犯的错误。


1
这不是默认设置,因为这个函数 - 以及整个Quartz - 在iOS和OS X上的操作方式完全相同,以实现可移植性,但由于某种原因,在iOS上他们倒置了[默认]系统范围内的坐标系。在Mac上,(0,0)是左下角,在iOS上则是左上角。如果您要移植Mac代码,您需要在执行所有代码之前仅反转和重新定位一次坐标系,而不是针对每个基元考虑它。 - Tommy

7
这是我正在使用的代码片段。
UIColor *mainTextColor = [UIColor whiteColor];
[mainTextColor set];
drawTextLjust(@"Sample Text", 8, 50, 185, 18, 16);

并且:

static void drawTextLjust(NSString* text, CGFloat y, CGFloat left, CGFloat right,
                          int maxFontSize, int minFontSize) {
    CGPoint point = CGPointMake(left, y);
    UIFont *font = [UIFont systemFontOfSize:maxFontSize];
    [text drawAtPoint:point forWidth:right - left withFont:font
       minFontSize:minFontSize actualFontSize:NULL
       lineBreakMode:UILineBreakModeTailTruncation
       baselineAdjustment:UIBaselineAdjustmentAlignBaselines];
}

函数期望一个NSString*,因此应该是@"Sample Text"。如果不是这样,那么对我来说它仍然有效,谢谢。但是我找不到drawAtPoint函数的参考,这让我有些担心。 - CiscoIPPhone
1
drawAtPoint是UIKit NSString类别的一部分 - http://developer.apple.com/library/ios/#documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html - Hunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接