Cómo hacer que el cursor sea visible automáticamente en UITextView
El siguiente es un escenario que podemos encontrar con frecuencia, como la interfaz de edición de correo electrónico.
La interfaz tiene los siguientes controles
UITextField *toTextField; // destinatario
UITextField *ccTextField; // cc
UITextField * sujetoTextField ; // asunto
UITextView *contentTextView; // contenido
Si la visualización está incompleta cuando hay demasiado contenido, también debemos agregar un UIScrollView y ajustar los controles anteriores. alrededor de él para Admite deslizar la interfaz hacia arriba y hacia abajo para ver todo el contenido
UIScrollView * scrollView;
Tal vez alguien se dé cuenta de que textView en sí se puede deslizar y que scrollView también se puede deslizar, lo que conducirá a muy mala experiencia. Al menos yo no dejaré que esta mala experiencia suceda, y estoy seguro de que tú también lo harás.
La solución es hacer que el marco de la vista de texto se adapte a su tamaño de contenido y luego cambiar dinámicamente el tamaño del contenido de la vista de desplazamiento para que la vista de texto no se deslice por sí sola.
Creo que la mayoría de la gente puede conocer los métodos de implementación específicos anteriores. Entonces, quienes lo hayan implementado se encontrarán con un problema difícil: cuando hay demasiado contenido, el cursor no se moverá hacia arriba automáticamente, lo que provocará que se pierda. Este es el problema principal presentado en este artículo: "El cursor es visible automáticamente"
//Aquí solo se introducen la adaptación de la vista de texto y la visibilidad automática del cursor, y se omiten otros detalles.
#pragma mark -- KVO --
- (void)addContentView
{
contentTextView = [[UITextView alloc] initWithFrame :CGRectMake(0, 157, 320.0f, 346)];
// Es muy importante establecer el espaciado inferior en 50.
Si no lo agrega, se producirán problemas anormales. Puede probarlo usted mismo
contentTextView.contentInset = UIEdgeInsetsMake(0, 0, 50, 0);
//Utilice KVO. para observar contentSize Dynamic
[ contentTextView addObserver: self forKeyPath: @ opciones "contentSize": NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context.nil];
CGSize size = scrollView.frame.size; p>
tamaño.height = CGRectGetMaxY(contentTextView.frame);
scrollView.contentSize = tamaño;
[scrollView addSubview: contentTextView]
}
p>- (void)observeValueForKeyPath: (NSString *)keyPath
ofObject.(id)object
cambio: (NSDictionary *)cambio
contexto: (void *)context
{
// escucha un cambio en el tamaño contensido de la vista de texto
if ((( [[) keyPath isEqualToString:@"contentSize"])
{
UITextView *view = object;
// Obtener la altura del último tamaño de contenido de textView
CGFloat contentHeight = view.contentSize.height;
CGSize scrollViewContentSize = scrollView.contentSize;
if (contentHeight gt; 346) { // 346 es el altura predeterminada de la vista de texto
CGRect frame = view.frame;
frame.size.height = contentHeight 50 // 50 es el espaciado inferior
view.frame = frame;
scrollViewContentSize.height = view.frame.origin.y view.frame.size.height;
}else {
scrollViewContentSize .height = vista.marco. origen.y vista.marco.tamaño.altura;
}else {
vista.marco.tamaño.altura = vista.marco
.origin.y view.frame.size.height;
}else {
scrollViewContentSize.height = view.frame.origin.yheight = view.frame.origin.y vista. frame.size.height - 14;
}
scrollView.contentSize = scrollViewContentSize
// Obtener el área de posición del cursor
CGRect cursorPosition = [view caretRectForPosition: view.selectedTextRange.start];
// Altura del cursor relativa a las coordenadas del marco de la vista superior (scrollView)
CGFloat height = cursorPosition.origin.y view .frame.origin.y - _mailScrollView.contentOffset.y;
//
CGFloat currentPoint = cursorPosition.origin.y;