Xcode / iOS5: mueve UIView hacia arriba, cuando aparece el teclado

Me gustaría subir mi vista, cuando se muestra el teclado. El teclado (altura: 216) debería hacer subir mi vista con su altura. ¿Es esto posible con un código simple?

Para mover la vista up , simplemente cambie su center . Primero, mantenga el original en una propiedad CGPoint .

 - (void)viewDidLoad { ... self.originalCenter = self.view.center; ... } 

Luego, cambie según sea necesario cuando aparezca el teclado:

 self.view.center = CGPointMake(self.originalCenter.x, /* new calculated y */); 

Finalmente, restaure cuando el teclado está oculto:

 self.view.center = self.originalCenter; 

Agregue azúcar de animación como lo desee

Tienes más de una forma de saber cuándo aparece el teclado.

Observando la notificación UIKeyboardDidShowNotification .

 /* register notification in any of your initWithNibName:bundle:, viewDidLoad, awakeFromNib, etc. */ { ... [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; ... } - (void)keyboardDidShow:(NSNotification *)note { /* move your views here */ } 

Haz lo opuesto con UIKeyboardDidHideNotification .

-O-

Implementar UITextFieldDelegate

Detecta al comenzar / finalizar la edición para mover las vistas.

 - (void)textFieldDidBeginEditing:(UITextField *)textField { /* keyboard is visible, move views */ } - (void)textFieldDidEndEditing:(UITextField *)textField { /* resign first responder, hide keyboard, move views */ } 

Según los campos de texto reales, es posible que necesite rastrear en qué campo está editando el usuario, agregue un temporizador para evitar mover demasiado las vistas.

hazlo así. después del teclado visible use este código

 - (void)textFieldDidBeginEditing:(UITextField *)textField { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.25]; self.view.frame = CGRectMake(0,-10,320,480); [UIView commitAnimations]; } 

Hice esto de manera similar a djromero, excepto que ajusté el origen del marco de la vista en lugar de su centro.

La vista que estoy moviendo es un UIScrollView, y quiero que se mueva con respecto a un elemento UITextField, para que el campo de texto siempre se muestre. La posición de este campo de texto puede variar según el desplazamiento de la vista de desplazamiento.

Entonces mi código se ve así:

 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; dispatch_async(dispatch_get_main_queue(), ^{ [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.2]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; self.scrollView.frame = CGRectMake(0,0,self.scrollView.frame.size.width,self.scrollView.frame.size.height); [UIView commitAnimations]; }); return YES; } - (NSInteger)getKeyBoardHeight:(NSNotification *)notification { NSDictionary* keyboardInfo = [notification userInfo]; NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey]; CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue]; NSInteger keyboardHeight = keyboardFrameBeginRect.size.height; return keyboardHeight; } -(void) keyboardDidShow:(NSNotification*) notification { NSInteger keyboardHeight; keyboardHeight = [self getKeyBoardHeight:notification]; NSInteger scrollViewFrameHeight = self.scrollView.frame.size.height; NSInteger textFieldRelativePosition = self.tableView.frame.origin.y - self.scrollView.contentOffset.y; NSInteger textFieldFrameOffset = scrollViewFrameHeight - textFieldRelativePosition; NSInteger movement = MAX(0,keyboardHeight-textFieldFrameOffset); // Offset from where the keyboard will appear. dispatch_async(dispatch_get_main_queue(), ^{ [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.2]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; self.scrollView.frame = CGRectMake(0,-movement, self.scrollView.frame.size.width, self.scrollView.frame.size.height); [UIView commitAnimations]; }); } 

El controlador de vista es un UITextFieldDelegate y también se suscribe a UIKeyboardDidShowNotification para que podamos acceder al tamaño del teclado.

Cuando el teclado muestra, calculamos el desplazamiento relativo del UITextField (ajustado para desplazamiento de desplazamiento) y el teclado y ellos cambian el origen de UIScrollView para que se mueva lo suficiente para que UITextField aún se muestre.

Si el UITextField aún se mostrará incluso si aparece el teclado, entonces el origen no cambia.

Esta es la forma más fácil y eficiente de lograr esto:

Agregue las siguientes constantes:

 static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3; static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2; static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8; static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216; static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 162; 

Agregue esto a su controlador de vista:

 CGFloat animatedDistance; 

Y agrega estos métodos a tu código:

 - (void)textFieldDidBeginEditing:(UITextField *)textField{ CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField]; CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view]; CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height; CGFloat numerator = midline - viewRect.origin.y - MINIMUM_SCROLL_FRACTION * viewRect.size.height; CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewRect.size.height; CGFloat heightFraction = numerator / denominator; if (heightFraction < 0.0) { heightFraction = 0.0; } else if (heightFraction > 1.0) { heightFraction = 1.0; } UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) { animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction); } else { animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction); } CGRect viewFrame = self.view.frame; viewFrame.origin.y -= animatedDistance; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; [self.view setFrame:viewFrame]; [UIView commitAnimations]; } - (void)textFieldDidEndEditing:(UITextField *)textfield{ CGRect viewFrame = self.view.frame; viewFrame.origin.y += animatedDistance; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; [self.view setFrame:viewFrame]; [UIView commitAnimations]; } 

mark, apple document: Gestión del teclado – Mover contenido que se encuentra debajo del teclado

 -(void)textFieldDidBeginEditing:(UITextField *)textField { CGFloat y = textField.frame.origin.y; if (y >= 350) //not 380 { CGRect frame = self.view.frame; frame.origin.y = 320 - textField.frame.origin.y; [UIView animateWithDuration:0.3 animations:^{self.view.frame = frame;}]; } } -(void)textFieldDidEndEditing:(UITextField *)textField { CGRect returnframe =self.view.frame; returnframe.origin.y = 0; [UIView animateWithDuration:0.3 animations:^{self.view.frame = frame;}]; } 

solo edite estos dos métodos.
respuesta simple a todos los códigos d. En la sentencia if, cambie el valor de acuerdo con el iphone, es decir, si iphone 4S lo cambia a 265 y si lo hace, cambie 320 a 240 y si iphone 5 lo cambia a 350 y en método didbeginediting manténgalo como 320, porque es la lógica si entiendes

Es de suponer que tiene algún código llamando [myTextField becomeFirstResponder]; . Deberías mover tu vista justo después de esta llamada.

Esta es la solución de Tendulkar, pero teniendo en cuenta el tamaño de fotogtwig original y la eliminación del teclado. Esta solución funciona para todos los dispositivos.

 -(BOOL) textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.25]; self.view.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height); [UIView commitAnimations]; return YES; } - (void)textFieldDidBeginEditing:(UITextField *)textField { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.25]; self.view.frame = CGRectMake(0,-50,self.view.frame.size.width,self.view.frame.size.height); [UIView commitAnimations]; } 

¡No olvides configurar el delegado UITextField!

Proyecto de ejemplo basado en la documentación del teclado de referencia de Apple

Archivo H: (No olvide el UITextFieldDelegate )

 @property (weak, nonatomic) IBOutlet UIScrollView *scrollview; @property (weak, nonatomic) IBOutlet UIView *myView; //items on view @property (weak, nonatomic) IBOutlet UISwitch *partySwitch; @property (weak, nonatomic) IBOutlet UILabel *partyLabel; @property (weak, nonatomic) IBOutlet UITextField *partyNameTextfield; 

Archivo M:

  //MARK: View Loading - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. }//eom -(void)viewDidAppear:(BOOL)animated { [self registerForKeyboardNotifications]; }//eom //MARK: textfield delegates -(bool)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return true; }//eom //MARK: - Keyboard Observers // Call this method somewhere in your view controller setup code. - (void)registerForKeyboardNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil]; } - (void)keyboardWasShown:(NSNotification*)aNotification { NSDictionary* info = [aNotification userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; CGRect bkgndRect = myView.superview.frame; bkgndRect.size.height += kbSize.height; [myView.superview setFrame:bkgndRect]; [scrollview setContentOffset:CGPointMake(0.0, myView.frame.origin.y-kbSize.height) animated:YES]; }//eom // Called when the UIKeyboardWillHideNotification is sent - (void)keyboardWillBeHidden:(NSNotification*)aNotification { UIEdgeInsets contentInsets = UIEdgeInsetsZero; scrollview.contentInset = contentInsets; scrollview.scrollIndicatorInsets = contentInsets; }//eom