CTFrame剪裁文本的第一行

在使用核心文本时,我遇到了一个问题,其中我在CTFrame显示的文本的第一行在CTFrame被截断,如下面的截图所示,字符“B”:

CTFrame裁剪第一行的示例

我想我在设置CTFrame的领先时做错了CTFrame 。 我的代码如下:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    CGContextRef context = UIGraphicsGetCurrentContext();

    NSAttributedString *myString;

    //Create the rectangle into which we'll draw the text
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, self.bounds);

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

    //Setup leading (line height)
    CGFloat lineHeight = 25;
    CTParagraphStyleSetting settings[] = {
        { kCTParagraphStyleSpecifierMinimumLineHeight, sizeof(CGFloat), &lineHeight },
        { kCTParagraphStyleSpecifierMaximumLineHeight, sizeof(CGFloat), &lineHeight },
    };

    CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings) / sizeof(settings[0]));
    NSDictionary * attrs = [[NSDictionary alloc] initWithObjectsAndKeys:

                                (__bridge id)CTFontCreateWithName((__bridge CFStringRef) font.fontName, font.pointSize, NULL) ,
                                (NSString*)kCTFontAttributeName,

                                (id)textColor.CGColor,
                                (NSString*)kCTForegroundColorAttributeName,

                                (__bridge id) paragraphStyle,
                                kCTParagraphStyleAttributeName,
                                nil];

    myString = [[NSAttributedString alloc] initWithString:text attributes:attrs];
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)myString);
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0,[myString length]), path, NULL);

    CTFrameDraw(frame, context);
    CFRelease(frame);
    CFRelease(framesetter);
    CFRelease(path);
}

其他SO帖子(这一个和这一个)并不真正有帮助。

我怎样才能防止CTFrame削减第一行?

- 编辑 -

lineheight降低到20:

从第二行开始的lineheight是受到尊重的,但是第一行文本的基线在顶部之下不到20。

在这里输入图像描述


这里CGFloat lineHeight = 25; 我确定(从你的屏幕截图中),它的字体大小小于你当前使用的字体大小( font.pointSize )。 这是裁剪文字顶部的唯一原因,因为文字大小不能适应25点的高度。

你有两个选择:

1)删除paragraphStyle及其相关代码。 通过以下代码替换您的NSDictionary * attrs = …

NSDictionary * attrs = [[NSDictionary alloc] initWithObjectsAndKeys:
                               (__bridge id)CTFontCreateWithName((__bridge CFStringRef) font.fontName, font.pointSize, NULL) ,
                                (NSString*)kCTFontAttributeName,
                                (id)textColor.CGColor, (NSString*)kCTForegroundColorAttributeName,
                                nil];

CTFrameDraw()将自动处理行高。

2)或者总是提供大于最大字体大小的lineHeight。 像lineHeight = font.pointSize + somemargine ;

要理解上面的解释,试试这个:在你当前的代码中设置lineHeight = 20; ; 你可以看到更多的文字将从顶行剪切,第二行文字将更靠近顶行的底部。


我设法解决了这个问题。 最后它变成了我翻转坐标系的位置,并且通过在代码中提前翻转它,问题得到修复。

链接地址: http://www.djcxy.com/p/14375.html

上一篇: CTFrame clipping first line of text

下一篇: Setting line spacing in a CTFrame