iPhone:如何在窗口中绘制文字?

时间:2009-07-12 08:01:32

标签: iphone quartz-2d

奇怪的情况 - 来自苹果的例子有效,但在我稍微改变它们之后,不会显示文字。这段代码正确地绘制了蓝色背景,但无论我做什么,都拒绝在其上绘制文本:

#import <UIKit/UIKit.h>

@interface CWnd : UIWindow @end
@implementation CWnd

- (void) drawRect : (CGRect) i_poRect
{
  // This is working : windows is blue.
  CGContextRef oContex = UIGraphicsGetCurrentContext();
  CGContextSetRGBFillColor( oContex, 0, 0, 255, 1 );
  CGContextFillRect( oContex, i_poRect );
  // This is not working : not text is displayed.
  CGContextSelectFont( oContex, "Monaco", 10, kCGEncodingFontSpecific );
  CGContextSetRGBStrokeColor( oContex, 255, 0, 0, 1 ); 
  CGContextSetRGBFillColor( oContex, 255, 0, 0, 1 ); 
  CGContextSetTextDrawingMode( oContex, kCGTextFill );
  CGContextSetTextPosition( oContex, 100, 100 );
  CGContextShowText( oContex, "abc", 3 );
}

@end

@interface CDelegate : NSObject <UIApplicationDelegate> @end
@implementation CDelegate

- (void)applicationDidFinishLaunching : (UIApplication *) i_poApp
{
  CGRect oRect = [ [ UIScreen mainScreen ] bounds ];
    [ [ [ CWnd alloc] initWithFrame : oRect ] makeKeyAndVisible ];
}

@end

int main(int argc, char *argv[])
{    
  return UIApplicationMain( argc, argv, nil, @"CDelegate" );
}

6 个答案:

答案 0 :(得分:5)

我使用以下代码没有问题直接将文本绘制到Quartz上下文中:

CGContextSetStrokeColorWithColor(context, strokeColor); 
CGContextSetFillColorWithColor(context, strokeColor);

CGContextSelectFont(context, "Helvetica", fontSize, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetTextPosition(context, 0.0f, round(fontSize / 4.0f));
CGContextShowText(context, [text UTF8String], strlen([text UTF8String]));

在你的情况下出现问题并不明显。在这种情况下,有两件事需要注意:由于UIViews及其CALayers的坐标空间翻转,文字可能会倒置,而且正如Rhythmic Fistman指出的那样,这不会处理UTF编码。

更好的,但性能较差的方法是做类似的事情:

CGContextSetFillColorWithColor(context, strokeColor);
[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:[UIFont fontWithName:@"Helvetica" size:fontSize]];

答案 1 :(得分:3)

嘿,我刚刚在我的代码中找到了一个注释。

显然CGContextShowTextAtPoint不适用于CGContextSetFont 您需要改为使用CGContextSelectFont。很明显,是吗?

无论如何,我知道情况并非如此,但您可以尝试使用CGContextShowTextAtPoint

这可能不属于单独的答案。

答案 2 :(得分:1)

其他人(herehere)已完成一些仿射变换并使用CGContextShowTextAtPoint方法使其正常工作:

CGContextSelectFont(oContex, @"Monaco", 10, kCGEncodingFontSpecific);
CGContextSetTextDrawingMode(oContex, kCGTextFill);
CGContextSetRGBFillColor(oContex, 1.0, 0.0, 0.0, 1.0);
CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(oContex, xform);
CGContextShowTextAtPoint(oContex, 100, 100, "abc", 3);

另一个可能的问题是CGContextSetRGBFillColor方法采用0.0到1.0范围内的浮点参数。您使用255来表示“全彩色”,这不是该方法所期望的。如果您对0到255范围更熟悉,则以下情况应该有效:

CGContextSetRGBFillColor(oContex, 255/255.0, 0/255.0, 0/255.0, 1.0);

答案 3 :(得分:1)

嘿,可能是编码问题。

尝试将kCGEncodingFontSpecific更改为kCGEncodingMacRoman

稍后当你全部工作时,摆脱CGContextShowTextAtPoint 它是垃圾,非unicode,并使用你需要的字形版本 禁止使用API​​。使用UIKit进行文字绘制会更好 它是unicode精明的,并且还有正确的字形替换字符
你的字体中没有。

答案 4 :(得分:1)

还有一种可能性,那就是您指定的文本位置位于您尝试绘制的矩形之外。通过替换

来测试它很容易
CGContextSetTextPosition( oContex, 100, 100 );

CGContextSetTextPosition( oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect));

答案 5 :(得分:1)

使用CGContextSetTextMatrix方法。 “颠倒问题”来自矩阵。