ios - Comment faire un mouvement UITextField lorsque le clavier est présent - sur le démarrage de la modification

Mots clés : iosobjective-cuiscrollviewuitextfielduikeyboardios

meilleur 5 Réponses ios - Comment faire un mouvement UITextField lorsque le clavier est présent - sur le démarrage de la modification

vote vote

100

#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]; } 
vote vote

84

// 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; } 
vote vote

73

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]; } 
origin.y -= scrollView.contentOffset.y 
activeField.frame.origin.y-(aRect.size.height) 
vote vote

66

-(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]; } 
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.animate(withDuration: movementDuration, delay: 0, options: [.beginFromCurrentState], animations: {         self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)     }, completion: nil) }  func textFieldDidBeginEditing(_ textField: UITextField) {     animateTextField(textField: textField, up:true) }  func textFieldDidEndEditing(_ textField: UITextField) {     animateTextField(textField: textField, up:false) } 
vote vote

51

- (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]; } 

Questions similaires