2012-05-30 1 views
1

I Utilisez CTFrameGetLineOrigins pour obtenir l'origine de chaque ligne. Mais il renvoie toujours une mauvaise origine de ligne.CTFrameGetLineOrigins Origine incorrecte

Le code:

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
CGContextTranslateCTM(context, 0, self.bounds.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

CTFontRef font = CTFontCreateUIFontForLanguage(kCTFontUserFontType, self.font.pointSize, NULL); 

CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFAttributedStringGetLength(attrString)), kCTForegroundColorAttributeName, self.textColor.CGColor); 
CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFAttributedStringGetLength(attrString)), kCTFontAttributeName, font); 

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString); 
CGPathRef path = CGPathCreateWithRect(CGRectInset(rect, TEXT_MARGIN, TEXT_MARGIN), NULL); 
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); 

CFArrayRef lines = CTFrameGetLines(frame); 
size_t numOfLines = CFArrayGetCount(lines); 
CGPoint lineOrigins[numOfLines]; 
CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), lineOrigins); 
for (CFIndex i = 0; i < numOfLines; i++) { 
    CTLineRef line = CFArrayGetValueAtIndex(lines, i); 
    CFArrayRef runs = CTLineGetGlyphRuns(line); 
    size_t numOfRuns = CFArrayGetCount(runs); 

    for (CFIndex j = 0; j < numOfRuns; j++) { 
     CTRunRef run = CFArrayGetValueAtIndex(runs, j); 

     CGRect strFrame = CGRectZero; 
     CGFloat width = 0; 
     CGFloat height = 0; 
     CGFloat leading = 0; 
     CGFloat ascent = 0; 
     CGFloat descent = 0; 
     CFRange strRange = CTRunGetStringRange(run); 
     CGFloat offsetX = CTLineGetOffsetForStringIndex(line, strRange.location, NULL); 

     width = (CGFloat)CTRunGetTypographicBounds(run, CFRangeMake(0, 0), &ascent, &descent, &leading); 
     width += leading; 
     height = ascent + descent; 
     NSLog(@"Line %ld : Offset Y: %f", i+1, lineOrigins[i].y); 
     strFrame = CGRectMake(lineOrigins[i].x + offsetX + TEXT_MARGIN, lineOrigins[i].y + TEXT_MARGIN - descent, width, height); 
     strFrame = CGRectIntegral(strFrame); 
     CFDictionaryRef attr = CTRunGetAttributes(run); 
     if (attr != NULL) { 
      CFStringRef url = CFDictionaryGetValue(attr, kCTFontURLAttribute); 
      if (url != NULL) { 
       [self.wordsFrame addObject:[NSDictionary dictionaryWithObjectsAndKeys:(__bridge NSString *)url, @"URL", NSStringFromCGRect(strFrame), @"frame", nil]]; 
      } 
     } 
    } 
} 
CTFrameDraw(frame, context); 

CFRelease(font); 
CGPathRelease(path); 
CFRelease(frame); 
CFRelease(framesetter); 

Résultats:

2012-05-30 12:58:21.464 hjday[9362:707] Line 1 : Offset Y: 97.000000 
2012-05-30 12:58:21.466 hjday[9362:707] Line 2 : Offset Y: 68.000000 
2012-05-30 12:58:21.472 hjday[9362:707] Line 3 : Offset Y: 39.000000 

Quelqu'un peut-il aider à me doigte ce qui ne va pas avec mon code? Ou y a-t-il d'autres moyens d'obtenir l'origine de chaque CTRun?

Répondre

3

Je l'ai: strFrame = CGRectMake(lineOrigins[i].x + offsetX + TEXT_MARGIN, self.bounds.size.height - (lineOrigins[i].y + TEXT_MARGIN - descent) - height, width, height);

besoin retourner la coordonnée y