Pregunta ¿Cómo puedo hacer que un UITextField suba cuando el teclado está presente?


Con el SDK de iOS:

tengo un UIView con UITextFields que muestran un teclado. Necesito que sea capaz de:

  1. Permitir el desplazamiento del contenido de la UIScrollView para ver los otros campos de texto una vez que se abre el teclado

  2. Automáticamente "saltar" (al desplazarse hacia arriba) o acortar

Sé que necesito un UIScrollView. Intenté cambiar la clase de mi UIView a un UIScrollView pero aún no puedo desplazar los cuadros de texto hacia arriba o hacia abajo.

¿Necesito tanto un UIView y un UIScrollView? ¿Uno entra dentro del otro?

¿Qué debe implementarse para desplazarse automáticamente al campo de texto activo?

Idealmente, la mayor parte de la configuración de los componentes posible se realizará en Interface Builder. Me gustaría escribir solo el código para lo que lo necesita.

Nota la UIView (o UIScrollView) con el que estoy trabajando aparece una tabbar (UITabBar), que necesita funcionar normalmente.


Editar: Estoy agregando la barra de desplazamiento solo para cuando aparezca el teclado. Aunque no es necesario, creo que proporciona una mejor interfaz porque el usuario puede desplazarse y cambiar cuadros de texto, por ejemplo.

Lo tengo funcionando donde cambio el tamaño del marco del UIScrollView cuando el teclado sube y baja Simplemente estoy usando:

-(void)textFieldDidBeginEditing:(UITextField *)textField { 
    //Keyboard becomes visible
    scrollView.frame = CGRectMake(scrollView.frame.origin.x, 
                     scrollView.frame.origin.y, 
scrollView.frame.size.width,
scrollView.frame.size.height - 215 + 50);   //resize
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
   //keyboard will hide
    scrollView.frame = CGRectMake(scrollView.frame.origin.x, 
       scrollView.frame.origin.y, 
     scrollView.frame.size.width,
      scrollView.frame.size.height + 215 - 50); //resize
}

Sin embargo, esto no se "mueve hacia arriba" automáticamente ni centra los campos de texto inferiores en el área visible, que es lo que realmente me gustaría.


1556


origen


Respuestas:


  1. Solo necesitarás un ScrollView si el contenido que tiene ahora no cabe en la pantalla del iPhone. (Si está agregando el ScrollView como la supervista de los componentes. solo para hacer el TextField desplazarse hacia arriba cuando aparece el teclado, luego no es necesario).

  2. Para mostrar el textfields sin estar oculto por el teclado, la forma estándar es subir / bajar la vista que tiene campos de texto cada vez que se muestra el teclado.

Aquí hay un código de muestra:

#define kOFFSET_FOR_KEYBOARD 80.0

-(void)keyboardWillShow {
    // Animate the current view out of the way
    if (self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

-(void)keyboardWillHide {
    if (self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
    if ([sender isEqual:mailTf])
    {
        //move the main view, so that the keyboard does not hide it.
        if  (self.view.frame.origin.y >= 0)
        {
            [self setViewMovedUp:YES];
        }
    }
}

//method to move the view up/down whenever the keyboard is shown/dismissed
-(void)setViewMovedUp:(BOOL)movedUp
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3]; // if you want to slide up the view

    CGRect rect = self.view.frame;
    if (movedUp)
    {
        // 1. move the view's origin up so that the text field that will be hidden come above the keyboard 
        // 2. increase the size of the view so that the area behind the keyboard is covered up.
        rect.origin.y -= kOFFSET_FOR_KEYBOARD;
        rect.size.height += kOFFSET_FOR_KEYBOARD;
    }
    else
    {
        // revert back to the normal state.
        rect.origin.y += kOFFSET_FOR_KEYBOARD;
        rect.size.height -= kOFFSET_FOR_KEYBOARD;
    }
    self.view.frame = rect;

    [UIView commitAnimations];
}


- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    // unregister for keyboard notifications while not visible.
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                             name:UIKeyboardWillHideNotification
                                           object:nil];
}

970



También estaba teniendo un gran problema con un UIScrollView componiendo de múltiples UITextFields, de los cuales, uno o más de ellos quedarían ocultos por el teclado cuando se editen.

Aquí hay algunas cosas a considerar si su UIScrollView no se desplaza correctamente

1) Asegúrese de que su contentSize sea mayor que el UIScrollView tamaño del marco. La forma de entender UIScrollViews es que el UIScrollView es como una ventana de visualización del contenido definido en contentSize. Entonces, cuando para el UIScrollview para desplazarse a cualquier parte, contentSize debe ser mayor que UIScrollView. De lo contrario, no es necesario desplazarse, ya que todo lo definido en contentSize ya está visible. Por cierto, por defecto contentSize = CGSizeZero.

2) Ahora que entiendes que el UIScrollView es realmente una ventana a su "contenido", la manera de asegurarse de que el teclado no oscurezca su UIScrollView's ver "ventana" sería cambiar el tamaño del UIScrollView para que cuando el teclado esté presente, tengas el UIScrollView tamaño de ventana solo al original UIScrollView frame.size.height menos la altura del teclado. Esto asegurará que su ventana sea solo esa pequeña área visible.

3) Aquí está el truco: cuando lo implementé por primera vez, pensé que tendría que obtener el CGRect del campo de texto editado y llamada UIScrollView's Método scrollRecToVisible. Implementé el UITextFieldDelegate método textFieldDidBeginEditing con la llamada al scrollRecToVisible método. Esto realmente funcionó con un extraño efecto secundario que el desplazamiento chasquido el UITextField en posición. Durante mucho tiempo no pude descifrar qué era. Luego comenté el textFieldDidBeginEditing Método de delegado y todo funciona !! (???). Como resultó, creo que el UIScrollView en realidad trae implícitamente el editado actualmente UITextField en la ventana visible implícitamente. Mi implementación de la UITextFieldDelegate método y posterior llamada a la scrollRecToVisible fue redundante y fue la causa del extraño efecto secundario.

Así que aquí están los pasos para desplazarse correctamente UITextField en un UIScrollView en su lugar cuando aparece el teclado.

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:self.view.window];
    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillHide:) 
                                                 name:UIKeyboardWillHideNotification 
                                               object:self.view.window];
    keyboardIsShown = NO;
    //make contentSize bigger than your scrollSize (you will need to figure out for your own use case)
    CGSize scrollContentSize = CGSizeMake(320, 345);
    self.scrollView.contentSize = scrollContentSize;
}

- (void)keyboardWillHide:(NSNotification *)n
{
    NSDictionary* userInfo = [n userInfo];

    // get the size of the keyboard
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;


    // resize the scrollview
    CGRect viewFrame = self.scrollView.frame;
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
    viewFrame.size.height += (keyboardSize.height - kTabBarHeight);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.scrollView setFrame:viewFrame];
    [UIView commitAnimations];

    keyboardIsShown = NO;
}

- (void)keyboardWillShow:(NSNotification *)n
{
    // This is an ivar I'm using to ensure that we do not do the frame size adjustment on the `UIScrollView` if the keyboard is already shown.  This can happen if the user, after fixing editing a `UITextField`, scrolls the resized `UIScrollView` to another `UITextField` and attempts to edit the next `UITextField`.  If we were to resize the `UIScrollView` again, it would be disastrous.  NOTE: The keyboard notification will fire even when the keyboard is already shown.
    if (keyboardIsShown) {
        return;
    }

    NSDictionary* userInfo = [n userInfo];

    // get the size of the keyboard
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    // resize the noteView
    CGRect viewFrame = self.scrollView.frame;
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
    viewFrame.size.height -= (keyboardSize.height - kTabBarHeight);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.scrollView setFrame:viewFrame];
    [UIView commitAnimations];
    keyboardIsShown = YES;
}
  1. Regístrese para las notificaciones de teclado en viewDidLoad
  2. Anular el registro para las nofitications del teclado en viewDidUnload
  3. Asegúrese de que contentSize está configurado y es mayor que tu UIScrollView a viewDidLoad
  4. Encogimiento el UIScrollView cuando el teclado está presente
  5. Volver el UIScrollView cuando el teclado se va.
  6. Use un ivar para detectar si el teclado ya se muestra en la pantalla, ya que las notificaciones del teclado se envían cada vez que UITextField se tabula incluso si el teclado ya está presente para evitar contracción el UIScrollView cuando ya es encogido

Una cosa a tener en cuenta es que el UIKeyboardWillShowNotification se disparará incluso cuando el teclado ya está en la pantalla cuando se tabula en otro UITextField. Me ocupé de esto usando un ivar para evitar cambiar el tamaño del UIScrollView cuando el teclado ya está en la pantalla. Inadvertidamente redimensionar el UIScrollView ¡cuando el teclado ya está allí sería desastroso!

Espero que este código les ahorre a muchos de ustedes muchos dolores de cabeza.


437



En realidad, lo mejor es usar la implementación de Apple, tal como se proporciona en documentos. Sin embargo, el código que proporcionan es defectuoso. Reemplace la porción encontrada en keyboardWasShown: justo debajo de los comentarios a lo siguiente:

NSDictionary* info = [aNotification userInfo];
CGRect keyPadFrame=[[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:self.view];
CGSize kbSize =keyPadFrame.size;
CGRect activeRect=[self.view convertRect:activeField.frame fromView:activeField.superview];
CGRect aRect = self.view.bounds;
aRect.size.height -= (kbSize.height);

CGPoint origin =  activeRect.origin;
origin.y -= backScrollView.contentOffset.y;
if (!CGRectContainsPoint(aRect, origin)) {
    CGPoint scrollPoint = CGPointMake(0.0,CGRectGetMaxY(activeRect)-(aRect.size.height));
    [backScrollView setContentOffset:scrollPoint animated:YES];
}

Los problemas con el código de Apple son estos: (1) Siempre calculan si el punto está dentro del marco de la vista, pero es un ScrollView, por lo que es posible que ya se haya desplazado y que deba contabilizar ese desplazamiento:

origin.y -= scrollView.contentOffset.y

(2) Cambian el contentOffset por la altura del teclado, pero queremos lo contrario (queremos cambiar el contentOffset por la altura que es visible en la pantalla, no lo que no es):

activeField.frame.origin.y-(aRect.size.height)

260



En textFieldDidBeginEditting y en textFieldDidEndEditing llamar a la función [self animateTextField:textField up:YES] al igual que:

-(void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    [self animateTextField:textField up:YES]; 
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField:textField up:NO];
}

-(void)animateTextField:(UITextField*)textField up:(BOOL)up
{
    const int movementDistance = -130; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? movementDistance : -movementDistance); 

    [UIView beginAnimations: @"animateTextField" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

Espero que este código te ayude.

En Swift 2

func animateTextField(textField: UITextField, up: Bool) 
{
     let movementDistance:CGFloat = -130
     let movementDuration: Double = 0.3

     var movement:CGFloat = 0
     if up 
     {
         movement = movementDistance
     }
     else 
     {
         movement = -movementDistance
     }
     UIView.beginAnimations("animateTextField", context: nil)
     UIView.setAnimationBeginsFromCurrentState(true)
     UIView.setAnimationDuration(movementDuration)
     self.view.frame = CGRectOffset(self.view.frame, 0, movement)
     UIView.commitAnimations()
}


func textFieldDidBeginEditing(textField: UITextField) 
{
    self.animateTextField(textField, up:true)
}

func textFieldDidEndEditing(textField: UITextField) 
{
    self.animateTextField(textField, up:false)
}

SWIFT 3

 func animateTextField(textField: UITextField, up: Bool)
    {
        let movementDistance:CGFloat = -130
        let movementDuration: Double = 0.3

        var movement:CGFloat = 0
        if up
        {
            movement = movementDistance
        }
        else
        {
            movement = -movementDistance
        }
        UIView.beginAnimations("animateTextField", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(movementDuration)
        self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
        UIView.commitAnimations()
    }


    func textFieldDidBeginEditing(textField: UITextField)
    {
        self.animateTextField(textField: textField, up:true)
    }

    func textFieldDidEndEditing(textField: UITextField)
    {
        self.animateTextField(textField: textField, up:false)
    }

238



Solo usando TextFields:

1a) Uso Interface Builder: Seleccionar todos los campos de texto => Editar => Insertar en => ScrollView

1b) Insertar campos de texto manualmente en UIScrollView llamado scrollView

2) Establecer UITextFieldDelegate

3) Establecer cada textField.delegate = self; (o hacer conexiones en Interface Builder)

4) Copiar pegar:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGPoint scrollPoint = CGPointMake(0, textField.frame.origin.y);
    [scrollView setContentOffset:scrollPoint animated:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [scrollView setContentOffset:CGPointZero animated:YES];
}

133



por Solución universal, Aquí estaba mi enfoque para implementar IQKeyboardManager.

enter image description here

Paso 1:- Agregué notificaciones globales de UITextField, UITextViewy UIKeyboard en una clase singleton. Yo lo llamo IQKeyboardManager.

Paso 2:- Si se encuentra UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotification o UITextViewTextDidBeginEditingNotification notificaciones, intento obtener topMostViewController instancia de la UIWindow.rootViewController jerarquía. Para descubrir correctamente UITextField/UITextView en eso, topMostViewController.viewEs necesario ajustar el marco.

Paso 3:- Calculé la distancia de movimiento esperada de topMostViewController.view con respecto a la primera respuesta UITextField/UITextView.

Etapa 4:- Me mudé topMostViewController.view.frame arriba / abajo según la distancia de movimiento esperada.

Paso 5: - Si se encuentra UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotification o UITextViewTextDidEndEditingNotification notificación, una vez más trato de obtener topMostViewController instancia de la UIWindow.rootViewController jerarquía.

Paso 6: - Calculé la distancia perturbada de topMostViewController.view que necesita ser restaurado a su posición original.

Paso 7: - Yo restauré topMostViewController.view.frame abajo de acuerdo a la distancia perturbada.

Paso 8: - Yo instanciado singleton IQKeyboardManager instancia de clase en la carga de la aplicación, por lo que cada UITextField/UITextView en la aplicación se ajustará automáticamente según la distancia de movimiento esperada.

Eso es todo IQKeyboardManager hacer por ti con SIN LÍNEA DE CÓDIGO ¡¡De Verdad!! solo es necesario arrastrar y soltar el archivo fuente relacionado al proyecto. IQKeyboardManager también apoyo Orientación del dispositivo, Gestión automática de la uololbar, KeybkeyboardDistanceFromTextField y mucho más de lo que piensas


106



He creado un drop-in universal UIScrollView, UITableView e incluso UICollectionView subclase que se encarga de mover todos los campos de texto fuera del camino del teclado.

Cuando el teclado esté a punto de aparecer, la subclase encontrará la subvista que está a punto de editarse, y ajustará su marco y el desplazamiento del contenido para asegurarse de que la vista esté visible, con una animación que coincida con el teclado emergente. Cuando el teclado desaparece, restaura su tamaño anterior.

Debería funcionar básicamente con cualquier configuración, ya sea UITableViewinterfaz basada en, o uno que consiste en vistas colocadas manualmente.

Aquí está: solución para mover campos de texto fuera del camino del teclado


99



por Rápido Programadores:

Esto hará todo por ti, solo ponlos en tu clase de controlador de vista e implementa la UITextFieldDelegate a su controlador de vista y configurar el delegado de textField a self 

textField.delegate = self // Setting delegate of your UITextField to self

Implementar los métodos de devolución de delegado:

func textFieldDidBeginEditing(textField: UITextField) {
    animateViewMoving(true, moveValue: 100)
}

func textFieldDidEndEditing(textField: UITextField) {
    animateViewMoving(false, moveValue: 100)
}

// Lifting the view up
func animateViewMoving (up:Bool, moveValue :CGFloat){
    let movementDuration:NSTimeInterval = 0.3
    let movement:CGFloat = ( up ? -moveValue : moveValue)
    UIView.beginAnimations( "animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration )
    self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
    UIView.commitAnimations()
}

84



Ya hay muchas respuestas, pero ninguna de las soluciones anteriores tenía todas las características de posicionamiento sofisticadas necesarias para una animación "perfecta" libre de errores, compatible con versiones anteriores y sin parpadeos. (error al animar frame / bounds y contentOffset juntos, diferentes orientaciones de interfaz, teclado dividido de iPad, ...)
Déjame compartir mi solución:
(suponiendo que haya configurado UIKeyboardWill(Show|Hide)Notification)

// Called when UIKeyboardWillShowNotification is sent
- (void)keyboardWillShow:(NSNotification*)notification
{
    // if we have no view or are not visible in any window, we don't care
    if (!self.isViewLoaded || !self.view.window) {
        return;
    }

    NSDictionary *userInfo = [notification userInfo];

    CGRect keyboardFrameInWindow;
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrameInWindow];

    // the keyboard frame is specified in window-level coordinates. this calculates the frame as if it were a subview of our view, making it a sibling of the scroll view
    CGRect keyboardFrameInView = [self.view convertRect:keyboardFrameInWindow fromView:nil];

    CGRect scrollViewKeyboardIntersection = CGRectIntersection(_scrollView.frame, keyboardFrameInView);
    UIEdgeInsets newContentInsets = UIEdgeInsetsMake(0, 0, scrollViewKeyboardIntersection.size.height, 0);

    // this is an old animation method, but the only one that retains compaitiblity between parameters (duration, curve) and the values contained in the userInfo-Dictionary.
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];

    _scrollView.contentInset = newContentInsets;
    _scrollView.scrollIndicatorInsets = newContentInsets;

    /*
     * Depending on visual layout, _focusedControl should either be the input field (UITextField,..) or another element
     * that should be visible, e.g. a purchase button below an amount text field
     * it makes sense to set _focusedControl in delegates like -textFieldShouldBeginEditing: if you have multiple input fields
     */
    if (_focusedControl) {
        CGRect controlFrameInScrollView = [_scrollView convertRect:_focusedControl.bounds fromView:_focusedControl]; // if the control is a deep in the hierarchy below the scroll view, this will calculate the frame as if it were a direct subview
        controlFrameInScrollView = CGRectInset(controlFrameInScrollView, 0, -10); // replace 10 with any nice visual offset between control and keyboard or control and top of the scroll view.

        CGFloat controlVisualOffsetToTopOfScrollview = controlFrameInScrollView.origin.y - _scrollView.contentOffset.y;
        CGFloat controlVisualBottom = controlVisualOffsetToTopOfScrollview + controlFrameInScrollView.size.height;

        // this is the visible part of the scroll view that is not hidden by the keyboard
        CGFloat scrollViewVisibleHeight = _scrollView.frame.size.height - scrollViewKeyboardIntersection.size.height;

        if (controlVisualBottom > scrollViewVisibleHeight) { // check if the keyboard will hide the control in question
            // scroll up until the control is in place
            CGPoint newContentOffset = _scrollView.contentOffset;
            newContentOffset.y += (controlVisualBottom - scrollViewVisibleHeight);

            // make sure we don't set an impossible offset caused by the "nice visual offset"
            // if a control is at the bottom of the scroll view, it will end up just above the keyboard to eliminate scrolling inconsistencies
            newContentOffset.y = MIN(newContentOffset.y, _scrollView.contentSize.height - scrollViewVisibleHeight);

            [_scrollView setContentOffset:newContentOffset animated:NO]; // animated:NO because we have created our own animation context around this code
        } else if (controlFrameInScrollView.origin.y < _scrollView.contentOffset.y) {
            // if the control is not fully visible, make it so (useful if the user taps on a partially visible input field
            CGPoint newContentOffset = _scrollView.contentOffset;
            newContentOffset.y = controlFrameInScrollView.origin.y;

            [_scrollView setContentOffset:newContentOffset animated:NO]; // animated:NO because we have created our own animation context around this code
        }
    }

    [UIView commitAnimations];
}


// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillHide:(NSNotification*)notification
{
    // if we have no view or are not visible in any window, we don't care
    if (!self.isViewLoaded || !self.view.window) {
        return;
    }

    NSDictionary *userInfo = notification.userInfo;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];

    // undo all that keyboardWillShow-magic
    // the scroll view will adjust its contentOffset apropriately
    _scrollView.contentInset = UIEdgeInsetsZero;
    _scrollView.scrollIndicatorInsets = UIEdgeInsetsZero;

    [UIView commitAnimations];
}

61



Shiun dijo: "Resultó que creo que el UIScrollView de hecho trae implícitamente el UITextField actualmente editado a la ventana visible implícitamente" Esto parece ser cierto para iOS 3.1.3, pero no para 3.2, 4.0 o 4.1. Tuve que agregar un scrollRectToVisible explícito para hacer que UITextField sea visible en iOS> = 3.2.


60



Esta el documento detalla una solución a este problema. Mire el código fuente en 'Moving Content that Is Located Under the Keyboard'. Es bastante sencillo.

EDITAR: Noté que hay un pequeño error en el ejemplo. Probablemente querrás escuchar UIKeyboardWillHideNotification en lugar de UIKeyboardDidHideNotification. De lo contrario, la vista de desplazamiento detrás del teclado se recortará durante la duración de la animación de cierre del teclado.


44