Это больно, но вы можете использовать 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
.