How to get UIKeyboard size with iOS

前端 未结 4 1711
后悔当初
后悔当初 2020-11-27 12:35

Is there some way to get UIKeyboard size programmatically. 216.0f height and 162.0f height in landscape.

Following seem to be deprecated. Is there some way that work

4条回答
  •  迷失自我
    2020-11-27 13:05

    Here's how I finally made works. I combined suggestions and codes from different answers. Features: dismissing keyboard, moving text fields above keyboard while editing and setting "Next" and "Done" keyboard return type.REPLACE "..." with more fields

    static const CGFloat ANIMATION_DURATION = 0.4;
    static const CGFloat LITTLE_SPACE = 5;
    CGFloat animatedDistance;
    CGSize keyboardSize;
    
    @interface ViewController () 
     @property (weak, nonatomic) IBOutlet UITextField *firstNameTXT;
      .....// some other text fields
     @property (weak, nonatomic) IBOutlet UITextField *emailTXT;
    @end
    
    @implementation ViewController
    - (void)viewDidLoad{
    .....
    // add tap gesture to help in dismissing keyboard
    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]
                                           initWithTarget:self
                                           action:@selector(tapScreen:)];// outside textfields
    
    [self.view addGestureRecognizer:tapGesture];
    
    // set text fields return key type to Next, last text field to Done
    [self.firstNameTXT setReturnKeyType:UIReturnKeyNext];
    .....
    [self.emailTXT setReturnKeyType:UIReturnKeyDone];
    
    // set text fields tags
    [self.firstNameTXT setTag:0];
    ....// more text fields
    [self.emailTXT setTag:5];
    
    // add keyboard notification
    [[NSNotificationCenter defaultCenter] addObserver:self     selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
    }
    [[NSNotificationCenter defaultCenter] addObserver:self      selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
    }
    
    // dismiss keyboard when tap outside text fields
    - (IBAction)tapScreen:(UITapGestureRecognizer *)sender {
      if([self.firstNameTXT isFirstResponder])[self.firstNameTXT resignFirstResponder];
      ...
      if([self.emailTXT isFirstResponder])[self.emailTXT  resignFirstResponder];
    
      }
    - (BOOL)textFieldShouldReturn:(UITextField *)textField{
       if(textField.returnKeyType==UIReturnKeyNext) {
         // find the text field with next tag
         UIView *next = [[textField superview] viewWithTag:textField.tag+1];
         [next becomeFirstResponder];
       } else if (textField.returnKeyType==UIReturnKeyDone || textField.returnKeyType==UIReturnKeyDefault) {
        [textField resignFirstResponder];
     }
    return YES;
    }
    
    // Moving current text field above keyboard
    -(BOOL) textFieldShouldBeginEditing:(UITextField*)textField{
       CGRect viewFrame = self.view.frame;
       CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
       CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
       CGFloat textFieldBottomLine = textFieldRect.origin.y + textFieldRect.size.height + LITTLE_SPACE;//
    
       CGFloat keyboardHeight = keyboardSize.height;
    
       BOOL isTextFieldHidden = textFieldBottomLine > (viewRect.size.height - keyboardHeight)? TRUE :FALSE;
      if (isTextFieldHidden) {
        animatedDistance = textFieldBottomLine - (viewRect.size.height - keyboardHeight) ;
        viewFrame.origin.y -= animatedDistance;
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:ANIMATION_DURATION];
        [self.view setFrame:viewFrame];
        [UIView commitAnimations];
      }
      return YES;
    }
    
    -(void) restoreViewFrameOrigionYToZero{
      CGRect viewFrame = self.view.frame;
      if (viewFrame.origin.y != 0) {
        viewFrame.origin.y = 0;
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:ANIMATION_DURATION];
        [self.view setFrame:viewFrame];
        [UIView commitAnimations];
      }
    }
    
    -(void)keyboardDidShow:(NSNotification*)aNotification{
       NSDictionary* info = [aNotification userInfo];
       keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
     }
    
    -(void)keyboardDidHide:(NSNotification*)aNotification{
       [self restoreViewFrameOrigionYToZero];// keyboard is dismissed, restore frame view to its  zero origin
    }
    @end
    

提交回复
热议问题