Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CGContextSelectFont and CGContextShowTextAtPoint in iOS 7

CGContextSelectFont and CGContextShowTextAtPoint are deprecated in iOS 7. What are equivalents in C?

All the answers I've seen give Objective-C equivalents (like using NSString methods) but I'm working in C++ files.

like image 531
Berry Blue Avatar asked Oct 27 '13 05:10

Berry Blue


1 Answers

Here is the solution. These functions have been deprecated in favor of Core Text. It's much more advanced but takes a while to figure out. This sample draws "Hello World!" using the Courier font.

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CFStringRef font_name = CFStringCreateWithCString(NULL, "Courier", kCFStringEncodingMacRoman);

    CTFontRef font = CTFontCreateWithName(font_name, 36.0, NULL);

    CFStringRef keys[] = { kCTFontAttributeName };

    CFTypeRef values[] = { font };

    CFDictionaryRef font_attributes = CFDictionaryCreate(kCFAllocatorDefault, (const void **)&keys, (const void **)&values, sizeof(keys) / sizeof(keys[0]), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

    CFRelease(font_name);

    CFRelease(font);

    int x = 10;
    int y = 10;
    const char *text = "Hello World!";

    CFStringRef string = CFStringCreateWithCString(NULL, text, kCFStringEncodingMacRoman);

    CFAttributedStringRef attr_string = CFAttributedStringCreate(NULL, string, font_attributes);

    CTLineRef line = CTLineCreateWithAttributedString(attr_string);

    CGContextSetTextPosition(context, x, y);

    // Core Text uses a reference coordinate system with the origin on the bottom-left
    // flip the coordinate system before drawing or the text will appear upside down
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CTLineDraw(line, context);

    CFRelease(line);

    CFRelease(string);

    CFRelease(attr_string);

    CGContextRestoreGState(context);
}

enter image description here

like image 150
Berry Blue Avatar answered Sep 21 '22 23:09

Berry Blue