Определите, когда CTLine является результатом разрыва строки

Я пытаюсь определить, является ли CTLineRef результатом разрыва строки. Я использую CTFramesetterCreateFrame для обработки всей логики разрыва строки (я не создаю разрывы строк вручную). У меня есть идея, как это сделать, но я надеюсь, что в CTLineRef есть какие-то метаданные, в которых конкретно указано, является ли это результатом нового разрыва строки.

Пример:

Оригинал:

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.

Итак, я хочу определить, является ли «продолжение какое-то время» результатом разрыва строки.


person PeqNP    schedule 06.10.2012    source источник
comment
вы можете получить диапазон, используя CTLineGetStringRange(ctlneref)   -  person yincan    schedule 08.10.2012


Ответы (1)


В итоге я использовал CTLineGetStringRange(CTLineRef). Просто для ясности; Это вернет местоположение в вашей резервной строке, которое представляет CTLineRef. После этого было простое сравнение между CFRange.location, возвращаемым CTLineGetStringRange, и расположением моей строки. 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"];
    }
}

К вашему сведению, я не ответил ни на один из ответов, потому что уже знал, что вызов API CTLineGetStringRange существует. Я надеялся, что вызов API предоставил мне логическое значение или что-то, указывающее, является ли конкретный CTLineRef продолжением предыдущей строки или нет.

person PeqNP    schedule 09.10.2012