iOS 8 UIView not moving up when keyboard appears

后端 未结 4 1717
甜味超标
甜味超标 2021-02-04 12:32

I am developing a chat app which has UITableView and a UIView containing a UITextField and a UIButton in it. I am using the f

4条回答
  •  悲哀的现实
    2021-02-04 13:19

    The accepted Answer is almost right. To match your view's animation to that of the keyboard you want to use the UIKeyboardWillChangeFrameNotification rather than the UIKeyboardDidChangeFrameNotification. That way the animations you kick off will precisely match that of the keyboard. Here's some code to do the entire thing. I use the animation of the keyboard to drive the animation of my autolayout constraint constants, but you can easily adapt this to animate an entire view frame. (Note, we have to use the old school style animations to hook into the UIKeyboardCurveInfoKey which provides an animation curve exactly matching the keyboard animation.

    In viewDidLoad:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardFrameDidChange:)
                                                 name:UIKeyboardWillChangeFrameNotification
                                               object:nil];
    

    In ViewController:

    - (void)keyboardFrameDidChange:(NSNotification *)notification {
        NSDictionary *info = [notification userInfo];
    
        CGRect kKeyBoardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
        CGFloat height = kKeyBoardFrame.size.height; 
        [self.view removeConstraints:self.verticalButtonConstraints];
        NSDictionary *metrics = @{@"height" : @(height)};
        NSDictionary *views = @{@"nextButton" : self.nextButton};
    
        self.verticalButtonConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:  [nextButton(52)]-(height)-|" options:0 metrics:metrics views:views];
        [self.view addConstraints:self.verticalButtonConstraints];
    
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
        [UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [self.view layoutIfNeeded];
       [UIView commitAnimations];
    

    }

提交回复
热议问题