Это больно, но вы можете использовать дополнения UIStringDrawing
к NSString
, чтобы сделать это. Вот общий алгоритм я использовал:
CGPoint origin = textView.frame.origin;
NSString* head = [textView.text substringToIndex:textView.selectedRange.location];
CGSize initialSize = [head sizeWithFont:textView.font constrainedToSize:textView.contentSize];
NSUInteger startOfLine = [head length];
while (startOfLine > 0) {
/*
* 1. Adjust startOfLine to the beginning of the first word before startOfLine
* 2. Check if drawing the substring of head up to startOfLine causes a reduction in height compared to initialSize.
* 3. If so, then you've identified the start of the line containing the cursor, otherwise keep going.
*/
}
NSString* tail = [head substringFromIndex:startOfLine];
CGSize lineSize = [tail sizeWithFont:textView.font forWidth:textView.contentSize.width lineBreakMode:UILineBreakModeWordWrap];
CGPoint cursor = origin;
cursor.x += lineSize.width;
cursor.y += initialSize.height - lineSize.height;
return cursor;
}
Я [NSCharacterSet whitespaceAndNewlineCharacterSet]
найти границы слов.
Это также можно сделать (предположительно более эффективно) с использованием CTFrameSetter
в CoreText
, но это не доступно в iPhone OS 3.1.3, так что, если вы ориентируетесь на iPhone вам нужно будет придерживаться UIStringDrawing
.
Вы говорите о точке ввода текста? я.e мигающая вертикальная полоса? –
Да, вот что я имею в виду. –
Существует не общедоступный метод получения этой информации. Чего вы пытаетесь достичь? Возможно, будет другой путь. –