核心文本视图具有黑色背景颜色。

6


我有一个使用CoreText渲染文本的UIView,一切都很好,唯一的问题是整个视图都是黑色背景颜色。我已经尝试了最基本的解决方案,比如

[self setBackgroundColor:[UIColor clearColor]];

或者
CGFloat components[] = {0.f, 0.f, 0.f, 0.f };
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGColorRef transparent = CGColorCreate(rgbColorSpace, components);
CGContextSetFillColorWithColor(context, transparent);
CFRelease(transparent);

但这并没有帮助到我。
我一直在思考这个问题,因为我不太理解核心文本是如何工作的, 以及这个纯C层与所有其他Objective-C内容的关系。 这并没有对解决这个问题有太大帮助, 所以我想问问您,能否为我提供解决方案(最重要的是) 并对其进行解释。

顺便说一下,我还发布了CoreText视图的代码。
它全部基于两个函数:parseText构建CFAttributedString和 drawRect负责绘制部分。

-(void) parseText {
    NSLog(@"rendering this text: %@", symbolHTML);
    attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
    CFAttributedStringReplaceString (attrString, CFRangeMake(0, 0), (CFStringRef)symbolHTML);

    CFStringRef fontName = (CFStringRef)@"MetaSerif-Book-Accent";
    CTFontRef myFont = CTFontCreateWithName((CFStringRef)fontName, 18.f, NULL); 
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[] = { 1.0, 0.3f, 0.3f, 1.f };
    CGColorRef redd = CGColorCreate(rgbColorSpace, components);
    CFAttributedStringSetAttribute(attrString, CFRangeMake(0,0),
                                   kCTForegroundColorAttributeName, redd);
    CFRelease(redd);

    CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFStringGetLength((CFStringRef)symbolHTML)), kCTFontAttributeName, myFont);



    CTTextAlignment alignment = kCTLeftTextAlignment;
    CTParagraphStyleSetting settings[] = {
        {kCTParagraphStyleSpecifierAlignment, sizeof(alignment), &alignment}
    };
    CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings) / sizeof(settings[0]));
    CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFStringGetLength((CFStringRef)attrString)), kCTParagraphStyleAttributeName, paragraphStyle);

    [self calculateHeight];
}

这是DrawRect函数:

- (void)drawRect:(CGRect)rect {
    /* get the context */
    CGContextRef context = UIGraphicsGetCurrentContext();    


    /* flip the coordinate system */    

    float viewHeight = self.bounds.size.height;
    CGContextTranslateCTM(context, 0, viewHeight);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0, 1.0));


    /* generate the path for the text */
    CGMutablePathRef path = CGPathCreateMutable();
    CGRect bounds = CGRectMake(0, 0, self.bounds.size.width-20.0, self.bounds.size.height);
    CGPathAddRect(path, NULL, bounds);    


    /* draw the text */
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter,
                                                CFRangeMake(0, 0), path, NULL);
    CFRelease(framesetter);
    CFRelease(path);
    CTFrameDraw(frame, context);
    CGFloat components[] = {0.f, 0.f, 0.f, 0.f };
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGColorRef transparent = CGColorCreate(rgbColorSpace, components);
    CGContextSetFillColorWithColor(context, transparent);
    CFRelease(transparent);
}

希望一切都清晰明了,但如果有什么看起来很困惑的地方,请随时问我,我很乐意更好地解释一下。

非常感谢您为这个艰难问题付出的努力 :)
k

1个回答

14
这里有一个问题。你记得设置view.opaque = NO吗?如果没有,无论你做什么,都会得到黑色背景。

是的,解决方案非常简单,我没有尝试它 :) 我只需要在viewController类中创建视图时设置setBackgroundColor:[UIColor clearColor]。无论如何,谢谢。 - holographix

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