2012-10-06 56 views
1

我試圖確定CTLineRef是否是換行的結果。我使用CTFramesetterCreateFrame來處理所有的換行邏輯(我不是手動創建換行符)。我對如何做到這一點有了一個想法,但我希望CTLineRef上有一些類型的元數據,特別說明是否是新換行符的結果。確定CTLine是否爲換行結果

例子:

原文:

This is a really long line that goes on for a while. 

CTFramesetterCreateFrame適用斷行後:

This is a really long line that 
goes on for a while. 

所以我想,以確定是否 '去了一會兒' 是的結果換行符。

+0

你可以使用CTLineGetStringRange(ctlneref) – yincan

回答

0

我結束了使用CTLineGetStringRange(CTLineRef)。爲了清楚起見;這將返回CTLineRef代表的支持字符串中的位置。之後,它是由CTLineGetStringRange返回的CFRange.location與我行的位置之間的簡單比較。 YMMV取決於你如何獲得特定線路的位置。我有一個專門用於獲取這些信息的類(下面會詳細介紹)。

下面是一些代碼:

NSUInteger totalLines = 100; // Total number of lines in document. 
NSUInteger numVisibleLines = 30; // Number of lines that can fit in the view port. 
NSUInteger fromLineNumber = 0; // 0 indexed line number. Add + 1 to get the actual line number 

NSUInteger numFormatChars = [[NSString stringWithFormat:@"%d", totalLines] length]; 
NSString *numFormat = [NSString stringWithFormat:@"%%%dd\n", numFormatChars]; 
NSMutableString *string = [NSMutableString string]; 
NSArray *lines = (NSArray *)CTFrameGetLines(textFrame); 

for (NSUInteger i = 0; i < numVisibleLines; ++i) 
{ 
    CTLineRef lineRef = (CTLineRef)[lines objectAtIndex:i]; 
    CFRange range = CTLineGetStringRange(lineRef); 

    // This is the object I was referring to that provides me with a line's 
    // meta-data. The _document is an instance of a specialized class I use to store 
    // meta-data about the document which includes where keywords, variables, 
    // numbers, etc. are located within the document. (fyi, this is for a text editor) 
    NSUInteger lineLocation = [_document indexOfLineNumber:fromLineNumber]; 

    // Append the line number. 
    if (lineLocation == range.location) 
    { 
     [string appendFormat:numFormat, actualLineNumber]; 
     actualLineNumber++; 
     fromLine++; 
    } 
    // This is a continuation of a previous line (wrapped line). 
    else 
    { 
     [string appendString:@"\n"]; 
    } 
} 

僅供參考,我沒有任何向上的答案,因爲我已經知道了CTLineGetStringRange API調用存在。我希望有一個API調用爲我提供了一個布爾值或,這表明特定的CTLineRef是前一行的延續或不是。

相關問題