Tengo problemas con mi código. Estoy tratando de mover UIScrollViewcuando estoy editando un elemento UITextFieldque debería estar oculto por la ventana emergente del teclado.
Estoy moviendo el marco principal en este momento porque no sé cómo 'desplazarme hacia arriba' en el código. Entonces, hice un poco de código, está funcionando bien, pero cuando edito un campo de texto de la interfaz de usuario y cambio a otro UITextFieldsin presionar el botón 'regresar', la vista principal va muy arriba.
Hice una NSLog()con mis variables tamaño, distancia y textFieldRect.origin.y como puede ver a continuación. Cuando pongo dos UITextFielden el mismo lugar (origen y) y hago este 'cambio' en particular (sin presionar retorno), obtengo los mismos números, mientras que mi código funcionó bien para la primera UITextFieldedición pero no para la segunda edición.
Mira esto:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
{
int size;
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
size = textFieldRect.origin.y + textFieldRect.size.height;
if (change == FALSE)
{
size = size - distance;
}
if (size < PORTRAIT_KEYBOARD_HEIGHT)
{
distance = 0;
}
else if (size > PORTRAIT_KEYBOARD_HEIGHT)
{
distance = size - PORTRAIT_KEYBOARD_HEIGHT + 5; // +5 px for more visibility
}
NSLog(@"origin %f", textFieldRect.origin.y);
NSLog(@"size %d", size);
NSLog(@"distance %d", distance);
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
change = FALSE;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
change = TRUE;
CGRect viewFrame = self.view.frame;
viewFrame.origin.y += distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
Algunas ideas ?
fuente


activeField.framea un marco relativo, yaactiveFieldque no tiene que ser un hijo inmediatoself.view. El código actualizado debería verse así:CGRect aRect = self.view.frame; aRect.size.height -= kbSize.height; CGRect relativeFieldFrame = [activeField convertRect:activeField.frame toView:self.view]; if (!CGRectContainsPoint(aRect, relativeFieldFrame.origin) ) { CGPoint scrollPoint = CGPointMake(0.0, relativeFieldFrame.origin.y-kbSize.height); [self.mainView.scrollView setContentOffset:scrollPoint animated:YES]; }UIKeyboardFrameEndUserInfoKeyclave en iOS 11 porque aUIKeyboardFrameBeginUserInfoKeymenudo me daría una altura de cero.