2011-12-04 24 views
4

我有一定數量的文本填充一些CTFrame(多於一個)。要創建所有框架(每個頁面一個框架),我填寫一個框架,使用CTFrameGetVisibleStringRange獲取不符合框架的文本,然後重複此過程,直到處理完所有文本。如何獲得在CTFrame上繪製的文本的真實高度

在除最後一幀以外的所有幀上,文本佔用頁面的相同高度。在最後一幀我想知道文本佔據的真實高度,知道我可以開始繪製更多文本的位置。

有沒有辦法做到這一點?

UPDATE

按照要求提出意見,這是一個使用@omz的建議下我的解決方案:

我使用ARC在我的項目:

CTFrameRef locCTFrame = (__bridge CTFrameRef)ctFrame; 

//Save CTLines 
lines = (NSArray *) ((__bridge id)CTFrameGetLines(locCTFrame)); 

//Get line origins 
CGPoint lOrigins[MAXLINESPERPAGE]; 
CTFrameGetLineOrigins(locCTFrame, CFRangeMake(0, 0), lOrigins); 
CGFloat colHeight = self.frame.size.height; 

//Save the amount of the height used by text 
percentFull = ((colHeight - lOrigins[[lines count] - 1].y)/colHeight); 

回答

3

您可以使用CTFrameGetLineOrigins獲取幀中最後一行的行起始位置,或使用CTFramesetterSuggestFrameSizeWithConstraints函數獲取給定範圍的矩形框的大小。如果您使用非矩形路徑來設置實際幀,後者將不起作用。

+0

謝謝@omz我想我會使用第一個,因爲我在另一個[CTFFramesetterSuggestFrameSizeWithConstraints]上看到[答案](http://stackoverflow.com/questions/2707710/core-texts-ctframesettersuggestframesizewithconstraints-returns-incorrect-siz)有時候會返回一個不正確的值。 – javsmo

+0

非常感謝你@omz它完美的工作! – javsmo

0

使用CTLineGetTypographicBounds

+0

你有沒有例子說明如何解答這個問題? – PaulG

7
+ (CGSize)measureFrame:(CTFrameRef)frame 
{ 
    // 1. measure width 
    CFArrayRef lines  = CTFrameGetLines(frame); 
    CFIndex  numLines = CFArrayGetCount(lines); 
    CGFloat  maxWidth = 0; 

    for(CFIndex index = 0; index < numLines; index++) 
    { 
     CTLineRef line = (CTLineRef) CFArrayGetValueAtIndex(lines, index); 
     CGFloat  ascent, descent, leading, width; 

     width = CTLineGetTypographicBounds(line, &ascent, &descent, &leading); 

     if(width > maxWidth) 
      maxWidth = width; 
    } 

    // 2. measure height 
    CGFloat ascent, descent, leading; 

    CTLineGetTypographicBounds((CTLineRef) CFArrayGetValueAtIndex(lines, 0), &ascent, &descent, &leading); 
    CGFloat firstLineHeight = ascent + descent + leading; 

    CTLineGetTypographicBounds((CTLineRef) CFArrayGetValueAtIndex(lines, numLines - 1), &ascent, &descent, &leading); 
    CGFloat lastLineHeight = ascent + descent + leading; 

    CGPoint firstLineOrigin; 
    CTFrameGetLineOrigins(frame, CFRangeMake(0, 1), &firstLineOrigin); 

    CGPoint lastLineOrigin; 
    CTFrameGetLineOrigins(frame, CFRangeMake(numLines - 1, 1), &lastLineOrigin); 

    CGFloat textHeight = ABS(firstLineOrigin.y - lastLineOrigin.y) + firstLineHeight + lastLineHeight; 

    return CGSizeMake(maxWidth, textHeight); 
} 
+0

使用@omz建議的CTFrameGetLineOrigins,我可以得到最後一行的原點並發現使用的高度,包括空白行。 – javsmo

+0

請顯示您的代碼 – abuharsky

+0

我試圖在這裏發佈代碼,但變得不可讀。我將編輯該問題。 – javsmo

相關問題