3

Core Textを使用しているときに問題が発生しCTFrameました。下のスクリーンショットに示すように、aに表示するテキストの最初の行が、文字「B」で途切れています。

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が最初の行をクリッピングしないようにするにはどうすればよいですか?

- 編集 -

20に減らすlineheight

lineheight2行目以降は尊重されますが、テキストの1行目のベースラインは上部から20未満です。

ここに画像の説明を入力してください

4

2 に答える 2

0

私は問題を解決することができました。最終的には、座標系を反転した場所であることが判明し、コードの早い段階で反転することで問題は解決しました。

于 2012-11-08T16:15:20.630 に答える
0
于 2012-10-28T19:04:54.937 に答える