2012-07-14 8 views
12

Le pregunté a un desarrollador (TwoLivesLeft, los creadores de Codea) cómo resaltaban la sintaxis en su aplicación. Él respondió:Obtener las coordenadas X e Y de una palabra en UITextView

@ TD2 el editor de Codea se implementa utilizando un UITextView. El resaltado se realiza superponiendo las subvistas en las posiciones apropiadas , generalmente UILabels. Se eliminan de un grupo de reutilización, , de forma similar a como funciona UITableViewCells. Durante el desplazamiento, las líneas que requieren volver a destacar los marcadores de extracción de la agrupación y las líneas que han movido de la pantalla vuelcan sus marcadores a la agrupación.

¿Alguien puede explicar cómo obtendría la xey de una palabra determinada?

+0

He aquí cómo. https://discussions.apple.com/thread/2511930?start=0&tstart=0 –

Respuesta

33

UITextView cumple con UITextInput, cuya descripción detallada se puede encontrar here.

Eche un vistazo a los métodos necesarios "textRangeFromPosition: toPosition:", "positionFromPosition: offset:", "positionFromPosition: inDirection: offset:", y algunos de los otros métodos basados ​​en geometría en el protocolo UITextInput. Esos podrían proporcionar la funcionalidad que está buscando.

No he intentado realmente asegurarme de que estos funcionen como usted los quiere, pero parece que se trata de lo que necesita.

¡Avíseme si necesita más ayuda!


ACTUALIZACIÓN:

Aquí hay un código de ejemplo de cómo hacer esto. Terminé obteniendo el método "firstRectForRange:" para que funcione. Este código básicamente toma las últimas tres letras de UITextView "textStuff" y lo resalta en verde.

UITextView *textStuff = [[UITextView alloc] init]; 
textStuff.frame = CGRectMake(2.0, 200.0, 200.0, 40.0); 
textStuff.text = @"how are you today?"; 
textStuff.textColor = [UIColor blackColor]; 

UITextPosition *Pos2 = [textStuff positionFromPosition: textStuff.endOfDocument offset: nil]; 
UITextPosition *Pos1 = [textStuff positionFromPosition: textStuff.endOfDocument offset: -3]; 

UITextRange *range = [textStuff textRangeFromPosition:Pos1 toPosition:Pos2]; 

CGRect result1 = [textStuff firstRectForRange:(UITextRange *)range ]; 

NSLog(@"%f, %f", result1.origin.x, result1.origin.y); 

UIView *view1 = [[UIView alloc] initWithFrame:result1]; 
view1.backgroundColor = [UIColor colorWithRed:0.2f green:0.5f blue:0.2f alpha:0.4f]; 
[textStuff addSubview:view1]; 

resultado de ejecutar este código:

enter image description here

+0

¿Tiene un código de inicio que podría darme algo de lo que echarme? – Sirens

+0

Actualicé la respuesta con un código de muestra. Comience desde allí y modifíquelo para que funcione de la manera que desee. – bddicken

+0

¿Esto funcionó para usted? Le agradecería que lo aceptara como la respuesta si fuera así. – bddicken

5

@ de bddicken https://stackoverflow.com/a/11487125/3549781 funciona como un encanto. Pero el problema es que no funciona en iOS 7+ si el texto contiene una nueva línea "\ n". Después de muchas búsquedas, encontré una solución para eso.

usted tiene que asegurarse la disposición de Textview antes de llamar firstRectForRange: por

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer]; 

Cortesía: UITextView firstRectForRange not working when there's new line characters in the mix

P.S: Al principio he añadido esto como un comentario a la respuesta de @ bddicken. Como la mayoría de las personas no leen comentarios, agregué esto como una respuesta.

Cuestiones relacionadas