10

理论上,这些应该是相同的大小,但它们不是:

蓝色文本来自 Core Text,黑色来自-[NSString drawInRect:]. 这是代码:

//Some formatting to get the correct frame
int y = MESSAGE_FRAME.origin.y + 8;

    if (month) y = y + 27;

    int height = [JHomeViewCellContentView heightOfMessage:self.entry.message];

    CGRect rect = CGRectMake(MESSAGE_FRAME.origin.x + 8, y, MESSAGE_FRAME.size.width - 16, height);


    //Draw in rect method
    UIFont *font = [UIFont fontWithName:@"Crimson" size:15.0f];

    [[UIColor colorWithWhite:0.2 alpha:1.0] setFill];

    [self.entry.message drawInRect:rect withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft];



    //Frame change to suit CoreText
    CGRect rect2 = CGRectMake(MESSAGE_FRAME.origin.x + 8, self.bounds.size.height - y - height, MESSAGE_FRAME.size.width - 16, height);

    //Core text method
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"Crimson", 15.0f, NULL);

    NSDictionary *attDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                   (__bridge_transfer id)fontRef, (NSString *)kCTFontAttributeName,
                                   (id)[[UIColor blueColor] CGColor], (NSString *)kCTForegroundColorAttributeName,
                                   nil];

    NSAttributedString *attString = [[NSAttributedString alloc] initWithString:self.entry.message attributes:attDictionary];

    //Flip the coordinate system
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);



    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, rect2);

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge_retained CFAttributedStringRef)attString);
    CTFrameRef theFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [attString length]), path, NULL);
    CFRelease(framesetter);
    CFRelease(path);

    CTFrameDraw(theFrame, context);
    CFRelease(theFrame);

字体是一样的。我不明白为什么一个人的渲染方式不同。

4

1 回答 1

4

这是因为NSLayoutManager使用一些不寻常的启发式方法来处理某些字体。

请参阅Core Text 中的行距如何工作?(以及为什么它与 NSLayoutManager 不同?)了解更多细节。

于 2012-05-17T13:14:52.477 回答