iphone - objective - uiscrollview autolayout
Cómo hacer que un UIScrollView se desplace automáticamente cuando un UITextField se convierte en un primer respondedor (7)
Aquí está la actualización de Swift 4 a la respuesta de @ Supertecnoboff. Funciono muy bien para mi.
func textFieldDidBeginEditing(_ textField: UITextField) {
scroll.setContentOffset(CGPoint(x: 0, y: (textField.superview?.frame.origin.y)!), animated: true)
}
func textFieldDidEndEditing(_ textField: UITextField) {
scroll.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
}
Asegúrese de extender UITextFieldDelegate y establecer el delegado de los campos de texto en self.
He visto publicaciones por here que sugieren que UIScrollViews
debería desplazarse automáticamente si una subvista UITextField
convierte en el primer respondedor; Sin embargo, no puedo averiguar cómo hacer que esto funcione.
Lo que tengo es un UIViewController
que tiene un UIScrollView
y dentro del UIScrollView
hay varios campos de texto.
Sé cómo hacerlo manualmente si es necesario; Sin embargo, por lo que he estado leyendo, parece posible tenerlo auto-enrollado. Ayuda por favor.
Espero que este ejemplo te ayude. Puedes desplazarte a cualquier punto con este código.
scrollView.contentOffset = CGPointMake(0,0);
Así que si tiene un campo de texto, debe tener alguna posición x, y en la vista, para que pueda usar
CGPoint point = textfield.frame.origin ;
scrollView.contentOffset = point
Esto debería funcionar,
Pero si no sabe cuándo llamar a este código, debería aprender los métodos de UITextFieldDelegate
Implementa este método en tu código.
- (void)textFieldDidBeginEditing:(UITextField *)textField {
// Place Scroll Code here
}
Espero que sepas cómo usar los métodos de delegado.
No hay nada que tengas que hacer manualmente. Es el comportamiento por defecto. Hay dos posibilidades en cuanto a por qué no estás viendo el comportamiento
- La razón más probable es que el teclado cubra su
UITextField
. Vea a continuación la solución - La otra posibilidad es que tenga otro
UIScrollView
en algún lugar de la jerarquía de vistas entre elUITextField
y elUIScrollView
que desea desplazar automáticamente. Esto es menos probable pero aún puede causar problemas.
Para el número 1, desea implementar algo similar a las recomendaciones de Apple para mover contenido que se encuentra debajo del teclado . Tenga en cuenta que el código proporcionado por Apple no tiene en cuenta la rotación. Para obtener mejoras en su código, consulte la implementación de esta publicación de blog del método keyboardDidShow
que traduce correctamente el marco del teclado usando la ventana.
Puede utilizar esta función para autoScroll de UITextField
en UITextFieldDelegate
- (void)textFieldDidBeginEditing:(UITextField *)textField {
[self autoScrolTextField:textField onScrollView:self.scrollView];
}
- (void) autoScrolTextField: (UITextField *) textField onScrollView: (UIScrollView *) scrollView {
float slidePoint = 0.0f;
float keyBoard_Y_Origin = self.view.bounds.size.height - 216.0f;
float textFieldButtomPoint = textField.superview.frame.origin.y + (textField.frame.origin.y + textField.frame.size.height);
if (keyBoard_Y_Origin < textFieldButtomPoint - scrollView.contentOffset.y) {
slidePoint = textFieldButtomPoint - keyBoard_Y_Origin + 10.0f;
CGPoint point = CGPointMake(0.0f, slidePoint);
scrollView.contentOffset = point;
}
EDITAR:
Ahora estoy usando IQKeyboardManager Kudos para el desarrollador de esto, debes intentarlo.
Sé que esta pregunta ya ha sido respondida, pero pensé que compartiría la combinación de código que usé de @Adeel y @Basil answer, ya que parece funcionar perfectamente para mí en iOS 9.
-(void)textFieldDidBeginEditing:(UITextField *)textField {
// Scroll to the text field so that it is
// not hidden by the keyboard during editing.
[scroll setContentOffset:CGPointMake(0, (textField.superview.frame.origin.y + (textField.frame.origin.y))) animated:YES];
}
-(void)textFieldDidEndEditing:(UITextField *)textField {
// Remove any content offset from the scroll
// view otherwise the scroll view will look odd.
[scroll setContentOffset:CGPointMake(0, 0) animated:YES];
}
También utilicé el método animado, lo que hace que la transición sea mucho más suave.
Si tiene varios campos de Textfield1
, diga Textfield1
, Textfield2
, Textfield3
y desea desplazar la vista de desplazamiento a lo largo del eje y cuando textfield2 se convierte en el primer respondedor:
if([Textfield2 isFirstResponder])
{
scrollView.contentOffset = CGPointMake(0,yourY);
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
CGRect rect = [textField bounds];
rect = [textField convertRect:rect toView:self.scrollView];
rect.origin.x = 0 ;
rect.origin.y -= 60 ;
rect.size.height = 400;
[self.scrollView scrollRectToVisible:rect animated:YES];
}