2011-02-02 16 views
5

Tengo un UITextView que se puede editar. Ahora tengo un requisito que me obliga a encontrar (a medida que sigo escribiendo) cuándo ha comenzado la siguiente línea (tal vez debido a que pulso la tecla de retorno o un salto de línea automático de salto de línea). ¿Hay alguna notificación que se pueda obtener para averiguar cuándo ha comenzado la siguiente línea mientras se escribe?UITextView (edición): detectar que ocurrió el siguiente evento de línea

Traté de buscar soluciones para encontrar las posiciones del cursor dentro de una vista de texto pero usar selectedRange y las propiedades de ubicación para encontrarlo no me ayuda. No hay ninguna correlación entre el valor de ubicación y una nueva línea. El valor de ubicación simplemente sigue aumentando al escribir. ¿Algunas ideas?

Gracias!

Respuesta

2

detectará cambios de línea de cualquier cosa a golpear "retorno", el retroceso para reducir la línea de conteo, escribiendo hasta el final de la línea y una palabra -la envoltura se produce, etc. (* Nota: DEBE ajustar las variables para el tamaño de fuente, recomiendo no usar números codificados como en mi ejemplo a continuación).

previousNumberOfLines = ((hiddenText.contentSize.height-37+21)/(21));//numbers will change according to font size 
NSLog(@"%i", previousNumberOfLines); 
10

Se llama al siguiente delegado cada vez que se ingresa un texto nuevo en textView.

Establecer el delegado de UITextView, luego el código de la siguiente manera

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; 
{ 
    if ([text isEqualToString:@"\n"]) { 
     //Do whatever you want 
    } 
    return YES; 
} 
+2

Ya uso UITextViewTextDidChangeNotification. ¿Y cómo busco un \ n en el texto? ¿TextView.text no devuelve todo el montón de texto escrito hasta el momento? Puede haber sucedido un salto de línea automático o podría haber golpeado muchos espacios. ¿Cómo puedo detectar la llegada de la siguiente línea en ese contexto? – Bourne

+0

@bourne: sí está detectando la clave de retorno solo – KingofBliss

+5

Sí lo hace. Pero detecta una línea nueva solo cuando hay una vista de texto vacía y lo primero que golpea dentro es una tecla de retorno. Estoy tratando de manejar el escenario multilínea textView wordwrap donde la separación de palabras provoca automáticamente un salto de línea. Deseo detectar ese evento de alguna manera. – Bourne

0

Agregue una segunda vista de texto oculto a su vista. Implemente shouldChangeTextInRange para la vista de texto visible, y configure el texto en la vista oculta para el nuevo texto. Compare el tamaño del contenido para el texto nuevo versus el antiguo para detectar el ajuste de palabras.

0
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
replacementText:(NSString *)text 
{ 

    if ([text isEqualToString:@"\n"]) { 
     textView.text=[NSString stringWithFormat:@"%@\n",textView.text]; 
     // Return FALSE so that the final '\n' character doesn't get added 
     return NO; 
    } 
    // For any other character return TRUE so that the text gets added to the view 
    return YES; 
} 
0

estoy un poco tarde a la fiesta, pero tuve un requisito similar, y después de un poco de investigación he encontrado que KingofBliss 'respuesta combinada con

-[id<NSLayoutManagerDelegate> layoutManager:shouldBreakLineByWordBeforeCharacterAtIndex:]; 
-[id<NSLayoutManagerDelegate> layoutManager:shouldBreakLineByHyphenatingBeforeCharacterAtIndex:]; 

hizo el truco para mí.

Se puede configurar cualquier objeto como el delegado de controlador de distribución UITextView 's de este modo:

textView.textContainer.layoutManager.delegate = (id<NSLayoutManagerDelegate>)delegate 

Hope esto prover útil.

4

Para uso Swift este

previousRect = CGRectZero 

func textViewDidChange(textView: UITextView) { 

     var pos = textView.endOfDocument 
     var currentRect = textView.caretRectForPosition(pos) 
     if(currentRect.origin.y > previousRect?.origin.y){ 
      //new line reached, write your code 
     } 
     previousRect = currentRect 

    } 

Para Objective C

CGRect previousRect = CGRectZero; 
- (void)textViewDidChange:(UITextView *)textView{ 

    UITextPosition* pos = textView.endOfDocument; 
    CGRect currentRect = [textView caretRectForPosition:pos]; 

    if (currentRect.origin.y > previousRect.origin.y){ 
      //new line reached, write your code 
     } 
    previousRect = currentRect; 

} 
+0

funciona muy bien para swift pero el desplazamiento debe estar habilitado en el textView –

Cuestiones relacionadas