ios CCLabelTTF带有核心文本的彩色子类

时间:2012-06-07 17:41:58

标签: objective-c ios cocos2d-iphone core-text

大家好日子。

目前我正在尝试使用NSAttributedString的suppport实现CCLabelTTF子类以获得多色标签。由于缺乏CoreText和CoreGraphics知识,我受到了阻碍。

在阅读了几个指南之后,我创建了CCTexture2D类别来使用NSAttributedString对象创建纹理。

这是我的绘图代码:

data = calloc(POTHigh, POTWide * 2);

colorSpace = CGColorSpaceCreateDeviceGray();
context = CGBitmapContextCreate(data, POTWide, POTHigh, 8, POTWide, colorSpace, kCGImageAlphaNone);
CGColorSpaceRelease(colorSpace);

if( ! context ) 
{
    free(data);
    [self release];
    return nil;
}

UIGraphicsPushContext(context);

CGContextTranslateCTM(context, 0.0f, POTHigh);
CGContextScaleCTM(context, 1.0f, -1.0f); 

// draw attributed string to context
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0.f, 0.f, dimensions.width, dimensions.height));

CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);

CTFrameDraw(frame, context);

UIGraphicsPopContext();

CFRelease(frame);
CGPathRelease(path);
CFRelease(frameSetter);

现在我遇到了一些麻烦:


第一个 - 我的纹理垂直翻转显示。我想,这些行

CGContextTranslateCTM(context, 0.0f, POTHigh);
CGContextScaleCTM(context, 1.0f, -1.0f); 

应该阻止这一点。


第二个,如果我创建RGB上下文,我在屏幕上看不到任何内容。我尝试使用这些行创建RGB上下文。

colorSpace = CGColorSpaceCreateDeviceRGB();
context = CGBitmapContextCreate(data, POTWide, POTHigh, 8, POTWide * 4, colorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Big);

我试图谷歌,但没有找到与我的问题相关的任何内容=(感谢任何帮助(链接或建议)。

3 个答案:

答案 0 :(得分:1)

尝试一些事情:

  • 您的数据分配对于RGB来说不够大。尝试:data = calloc(POTHigh, POTWide * 4);用于RGB色彩空间。
  • CTFrameDraw与GL coords相关,因此您无需使用CGContextScaleCTM(context, 1.0f, -1.0f);
    • 该行被放入CCLabelTTF的原始CCTexture2D创建中,因为它使用了与UIKit coords相关的NSString的drawInRect:
  • 也许尝试其他alpha掩码标志......?查看Apple在Supported Pixel Formats for iOS上的文档,了解您的选择。

答案 1 :(得分:0)

您可能需要查看ActiveTextView-iOS(https://github.com/storify/ActiveTextView-iOS)。它可能有用。

答案 2 :(得分:0)

使用它来获得颜色纹理:

context = CGBitmapContextCreate(data, POTWide, POTHigh, 8, POTWide, colorSpace, kCGImageAlphaPremultipliedLast);