2009-02-09 19 views
30

tengo una UIView y añadir un editable UITextView a ella,UITextView desplazamiento automático hacia abajo

UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(5, 5, 219, 47)]; 
[self addSubview:textView]; 
textView.font = [UIFont systemFontOfSize:14]; 

Cuando escribo que no baja automática. Alguien tiene una idea?

Respuesta

0

si encontró una solución

puse el TextView en una vista y establecer la vista a ClipToBounds = SÍ entonces puse la TextView a una altura de 70

que fija el problema.

solución muy extraño, pero finalmente funciona :)

+0

Si 70 es más bajo que la altura original de su UITextView, entonces se recorta a ese valor y probablemente por coincidencia, esto es exactamente lo que necesita su caso para "desplazarse automáticamente" a la última línea. Es un poco demasiado hackish :) –

7

creo que tendrá que hacer

[textView scrollRangeToVisible:[textView selectedRange]]; 

en textDidChange.

+0

nada que no hace nada –

+0

hmm, extraño. puede intentarlo [textView scrollRangeToVisible: NSMakeRange (textView.text.length, 0)]; –

+0

tampoco funciona –

52

acabo de descubrir que debe utilizar una longitud> 0. Es decir

NSRange range = NSMakeRange(textView.text.length - 1, 1); 
[textView scrollRangeToVisible:range]; 

trabajado para mí de todos modos.

+1

Gracias, esto fue útil. También debe verificar si textView.text.length> 0. –

+0

Tenga en cuenta que esto hará que textView se desplace hasta la parte inferior. No es una gran idea poner esto en textViewDidChange de UITextView: delegar; si está editando en la parte superior de la vista de texto, se desplazará hacia abajo, que no es lo que el usuario esperaría. –

+1

intenté diferentes soluciones, pero esta es la que funcionó como un amuleto – gangt

11

Para desplazarse al final del búfer que intentaron

[textView scrollRangeToVisible:NSMakeRange([textView.text length]-1, 1)]; 

pero no pasó nada. En vez esto funciona

textView.selectedRange = NSMakeRange(textView.text.length - 1, 0); 
0

Esto funciona:

- (void)textViewDidChange:(UITextView *)textView { 
    if (_moveToBottom) { 
     int y = textView.contentSize.height - textView.frameHeight + self.textView.contentInset.bottom + self.textView.contentInset.top; 
     if(y > 0) { 
      [textView setContentOffset:CGPointMake(0, y) animated:YES]; 
     } 
     _moveToBottom = NO; 
    } 
    else { 
     [textView scrollRangeToVisible:NSMakeRange([textView.text length]-1, 1)]; 
    } 
} 

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
    if ([text isEqualToString:@"\n"] && range.location == [textView.text length]) { 
     _moveToBottom = YES; 
    } 
    return YES; 
} 
1

Uso contentOffset, se desplazará automáticamente a abajo

textView.contentOffset = CGPointMake(0, textView.contentSize.height - textView.frame.size.height); 
3

Al añadir texto a un cuadro de texto mediante programación, descubrí que también necesitaba agregar "[textView layout IfNeeded]" para configurar las cosas antes de que la nueva posición de desplazamiento se pudiera calcular correctamente.

por ejemplo:

[newString appendFormat:@"%@\n",addText]; 
textView.text = newString; 
[textView layoutIfNeeded]; 
NSRange range = NSMakeRange(textView.text.length - 2, 1); //I ignore the final carriage return, to avoid a blank line at the bottom 
[textView scrollRangeToVisible:range] 

Sin esta adición el cuadro de texto a veces no sería desplazarse, o sería desplazarse varias líneas cada vez que se añadió una sola línea de datos.

+0

Esto funcionó para mí: '[textView layoutIfNeeded]; [textView scrollRangeToVisible: NSMakeRange (0, 0)]; ' – mehdok

2

Swift 2.2. Funciona para mí

func textViewDidChange(textView: UITextView) { 

    let bottomOffset = CGPointMake(0, textView.contentSize.height - textView.bounds.size.height) 
    textView.setContentOffset(bottomOffset, animated: true) 
} 
+0

Parece que funciona cuando el UITextView es más grande que su contenido, pero tan pronto como el contenido crece más que el tamaño en la pantalla, ya no se desplaza por mí. – lionello

0

He descubierto que si el texto añadido a la UITextView contenía retornos de carro, entonces el TextView no sería desplazarse correctamente.

Añadí la lógica de la siguiente manera para permitir que los límites se calculen correctamente antes de desplazarse al rango.

BOOL autoscroll = NO; 

//I added a 10 px buffer here to allow for better detection as the textview is auto populated 
if (textView.contentOffset.y >= (textView.contentSize.height - textView.frame.size.height - 10)) 
{ 
    autoscroll = YES; 
} 

[textView setText:messageString]; 
[textView layoutSubviews]; 

if(autoscroll) { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)),  dispatch_get_main_queue(), ^{ 
     [textView scrollRangeToVisible:NSMakeRange(textView.text.length - 1, 1)]; 
    }); 
} 
Cuestiones relacionadas