NSString drawInRect: withFont: и основной текст, рисуемый в том же Draw Rect - PullRequest
2 голосов
/ 06 марта 2012

Я хочу нарисовать строку "Hello World!" дважды. Один раз с методом категории NSString's UIStringDrawing и один раз с использованием Core Text. Независимо от того, что я пробую, версия Core Text рисует путь к большому. У кого-нибудь есть объяснение, почему?

Полная реализация созданного мной подкласса UIView bare * UIView приведена ниже.

@implementation CTView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.opaque = YES;
        self.backgroundColor = [UIColor whiteColor];
    }
    return self;
}

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

    [[UIColor blackColor] set];
    NSString *helloWorld = @"Hello World!";
    UIFont *helloWorldFont = [UIFont systemFontOfSize:16];

    CGContextSaveGState(c); {
        [helloWorld drawInRect:rect
                      withFont:helloWorldFont];
    } CGContextRestoreGState(c);

    CGContextSaveGState(c); {  

        // setting up attributed string of the catagory name to draw with Core Text    
        NSMutableAttributedString *name = [[NSMutableAttributedString alloc] initWithString:@"P"];
        [name setFont:helloWorldFont];
        [name setTextColor:[UIColor blackColor]];    

        // getting frames for the text    
        CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)name);    
        CFRelease(name);    

        CGMutablePathRef path = CGPathCreateMutable();
        CGPathAddRect(path, NULL, rect);
        CTFrameRef textFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
        CGPathRelease(path);
        CFRelease(framesetter);

        // draw the text
        CTFrameDraw(textFrame, c);
        CFRelease(textFrame);        
    } CGContextRestoreGState(c);  

}

@end
...