¿Cómo hago que UITextView esté a la altura de la pantalla less el keyboard en iOS 7?

Mi código funcionaba bien con iOS 6, pero con iOS 7 no puedo hacer que UITextView sea la altura de la pantalla del dispositivo less el keyboard (en otras palabras, cuando el keyboard está arriba, el UITextView sigue siendo pantalla completa pero no pasar por debajo del keyboard).

Por un lado, cuando coloco el UITextView en mi controller de vista (que está embedded en un controller de navigation) también tiene que estar debajo de la barra de navigation, de lo contrario, comienza demasiado abajo.

A partir de ahí probé todos estos ejemplos:

self.textView.contentInset = UIEdgeInsetsMake(0, 0, 230, 0); self.textView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 230, 0); self.textView.textContainerInset = UIEdgeInsetsMake(0, 0, 230, 0); 

Donde en cada uno el keyboard todavía pasa por encima de la vista de text en algunos puntos. También intenté establecer una restricción de altura y manipular la constante, pero sin suerte.

 self.height.constant = self.height.constant - 240.0; 

(Donde height es la salida de la restricción).

Todos estos han sido probados antes y después de un [self.textField becomeFirstResponder]; llamada.

¿Cómo voy a lograr esto? Solo quiero una pantalla completa de UITextView donde el cursor no quede debajo del keyboard, pero esa funcionalidad básica parece loca en iOS 7.

La forma "correcta" de hacer esto pre-iOS7 siempre ha sido ajustar la propiedad contentInset de UITextView (una subclass UIScrollView) cuando el keyboard se muestra u oculta. No he investigado personalmente, pero parece que esto no funciona bien en iOS7 porque el recuadro inferior no se cumple o hay algún problema con el cursor aún debajo del keyboard. Vea esta pregunta para reference.

En el caso en que esté utilizando el layout automático, y todo lo que desea es una vista de text de "pantalla completa", simplemente puede ajustar una sola restricción cuando el keyboard se muestra u oculta. Esto ajustará la altura de la vista de text:

 @implementation TSViewController { IBOutlet NSLayoutConstraint* _textViewSpaceToBottomConstraint; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; } - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } - (void) keyboardWillShow: (NSNotification*) n { NSValue* bv = n.userInfo[UIKeyboardFrameEndUserInfoKey]; CGRect br = [bv CGRectValue]; _textViewSpaceToBottomConstraint.constant = br.size.height; } - (void) keyboardWillHide: (NSNotification*) n { _textViewSpaceToBottomConstraint.constant = 0; } @end 

En el guión gráfico, suelte su UITextView en la vista de controller de vista y agregue 4 restricciones para pegar sus bordes a los bordes de la vista de controller de vista. Conecte la restricción de espacio inferior a IBOutlet _textViewSpaceToBottomConstraint en el controller de vista.

Es probable que pueda jugar un poco con esto y ajustar el tamaño dentro de un bloque de animation, pidiendo prestado el time de animation y la curva de la notificación del keyboard.

Me interesaría ver una versión de esto que establezca el contenido de inicio y que funcione correctamente …

introduzca la descripción de la imagen aquí

EDITAR

Aquí hay otra pregunta SO que cubre este tema, con una solución. Al parecer, el problema con el cursor (cursor) fuera de cuadro es el mismo problema que mencioné anteriormente. la forma "correcta" de hacer esto, que es establecer la propiedad contentInset. Por lo tanto, una solución para este problema debería permitirle simplemente ajustar el contenidoIndividir vs. cambiar el marco de vista de text (a través de .frame o a través de una restricción).

EDIT 2

Una última reflexión sobre esto. En iOS7, el keyboard es translúcido. El usuario debe poder ver el contenido detrás del keyboard. Al modificar el tamaño de UITextView para que esté por encima del keyboard, esto nunca sucederá. Por lo tanto, la solución "correcta" sigue siendo ajustar el contenido de Interconnection para la parte inferior de la vista de text, para agregar la altura del keyboard al área desplazable de la vista de text. Entonces, en un mundo ideal, ajustarías el contenido de la vista de text para mantener el cursor visible cuando aparezca el keyboard. Finalmente, agregue a eso la "corrección" para mantener el cursor en position sobre el keyboard cuando se muestra, pero el usuario está ingresando líneas nuevas.

La solución a esto en iOS7 es poner tableview en una vista de contenedor, que se convierte en su vista principal. Puede agregar restricciones a este para que esté adjunto a la topLayoutGuide . Agregue una segunda vista de marcador de position que está limitada al final de la tabla en la parte superior, y al bottomLayoutConstraint a la conclusión de bottomLayoutConstraint en la parte inferior. Agregue una restricción a esta vista de marcador de position de modo que su altura sea 0 y mantenga un ivar apuntándolo. Puede proporcionar una subclass UITableViewController que invalida la propiedad tableView con la vista de tabla real.

Cuando el keyboard esté listo para aparecer, puede get el alto de la tabla de la notificación (código a continuación) y animar la configuration de la propiedad de constraint de la vista de marcador de position a la altura del keyboard.

El código de notificación del keyboard se encuentra a continuación:

 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; [defaultCenter addObserver:self selector:@selector(keyboardMoving:) name:UIKeyboardWillShowNotification object:nil]; [defaultCenter addObserver:self selector:@selector(keyboardMoving:) name:UIKeyboardWillHideNotification object:nil]; [defaultCenter addObserver:self selector:@selector(keyboardMoving:) name:UIKeyboardDidHideNotification object:nil]; } -(void)viewWillDisappear:(BOOL)animated { NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; [defaultCenter removeObserver:self name:UIKeyboardWillShowNotification object:nil]; [defaultCenter removeObserver:self name:UIKeyboardWillHideNotification object:nil]; [defaultCenter removeObserver:self name:UIKeyboardDidHideNotification object:nil]; [super viewWillDisappear:animated]; } - (void)keyboardMoving:(NSNotification *)note { NSString *msg = note.name; if([msg isEqualToString:UIKeyboardWillShowNotification] && !_keyboardUp) { _keyboardUp = YES; [[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&_animationDuration]; [[note.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&_keyboardRect]; NSLog(@"ORIG KEYBOARD %@", NSStringFromCGRect(_keyboardRect)); _keyboardRect = [self.view convertRect:_keyboardRect fromView:nil]; NSLog(@"NEW KEYBOARD %@", NSStringFromCGRect(_keyboardRect)); _animate = YES; } else if([msg isEqualToString:UIKeyboardWillHideNotification] && _keyboardUp) { _keyboardUp = NO; _animate = YES; } else if([msg isEqualToString:UIKeyboardDidHideNotification]) { _keyboardUp = NO; _animate = NO; } } - (BOOL)isKeyboardMovingUp { return _keyboardUp == YES && _animate == YES; } - (BOOL)isKeyboardMovingDown { return _keyboardUp == NO && _animate == YES; } - (BOOL)isKeyboardDown { return _keyboardUp == NO && _animate == NO; } 

Lo que tendrá que hacer es antes de que el keyboard salte o, simplemente, siempre cree una vista de contenedor vacío y agregue, agregue la tabla a esa vista, agregue