UIKeyboardBoundsUserInfoKey is deprecated, what to use instead?

前端 未结 9 1753
我在风中等你
我在风中等你 2020-12-02 04:56

I\'m working on an iPad app using 3.2 sdk. I\'m dealing with obtaining the keyboard size to prevent my textfields from hidding behind it.

I\'m getting a Warning in

相关标签:
9条回答
  • 2020-12-02 05:21

    From the documentation for UIKeyboardBoundsUserInfoKey:

    The key for an NSValue object containing a CGRect that identifies the bounds rectangle of the keyboard in window coordinates. This value is sufficient for obtaining the size of the keyboard. If you want to get the origin of the keyboard on the screen (before or after animation) use the values obtained from the user info dictionary through the UIKeyboardCenterBeginUserInfoKey or UIKeyboardCenterEndUserInfoKey constants. Use the UIKeyboardFrameBeginUserInfoKey or UIKeyboardFrameEndUserInfoKey key instead.

    Apple recommends implementing a convenience routine such as this (which could be implemented as a category addition to UIScreen):

    + (CGRect) convertRect:(CGRect)rect toView:(UIView *)view {
        UIWindow *window = [view isKindOfClass:[UIWindow class]] ? (UIWindow *) view : [view window];
        return [view convertRect:[window convertRect:rect fromWindow:nil] fromView:nil];
    }
    

    to recover window-adjusted keyboard frame size properties.

    I took a different approach, which involves checking the device orientation:

    CGRect _keyboardEndFrame;
    [[notification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&_keyboardEndFrame];
    CGFloat _keyboardHeight = ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) ? _keyboardEndFrame.size.height : _keyboardEndFrame.size.width;
    
    0 讨论(0)
  • 2020-12-02 05:22

    Here is a good details http://i-phone-dev.blogspot.com/2012/01/different-way-to-show-keyboard-and.html

    0 讨论(0)
  • 2020-12-02 05:28
    - (CGSize)keyboardSize:(NSNotification *)aNotification {
        NSDictionary *info = [aNotification userInfo];
        NSValue *beginValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];
    
        UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    
        CGSize keyboardSize;
        if ([UIKeyboardDidShowNotification isEqualToString:[aNotification name]]) {
            _screenOrientation = orientation;
            if (UIDeviceOrientationIsPortrait(orientation)) {
                keyboardSize = [beginValue CGRectValue].size;
            } else {
                keyboardSize.height = [beginValue CGRectValue].size.width;
                keyboardSize.width = [beginValue CGRectValue].size.height;
            }
        } else if ([UIKeyboardDidHideNotification isEqualToString:[aNotification name]]) {
            // We didn't rotate
            if (_screenOrientation == orientation) {
                if (UIDeviceOrientationIsPortrait(orientation)) {
                    keyboardSize = [beginValue CGRectValue].size;
                } else {
                    keyboardSize.height = [beginValue CGRectValue].size.width;
                    keyboardSize.width = [beginValue CGRectValue].size.height;
                }
            // We rotated
            } else if (UIDeviceOrientationIsPortrait(orientation)) {
                keyboardSize.height = [beginValue CGRectValue].size.width;
                keyboardSize.width = [beginValue CGRectValue].size.height;
            } else {
                keyboardSize = [beginValue CGRectValue].size;
            }
        }
    
    
        return keyboardSize;
    }
    
    0 讨论(0)
  • 2020-12-02 05:29

    @Jason, you code if fine except for one point.

    At the moment you are not actually animating anything and the view will simply `pop' to its new size.height.

    You have to specify a state from which to animate. An animation is a sort of (from state)->(to state) thing.

    Luckily there is a very convenient method to specify the current state of the view as the (from state).

    [UIView setAnimationBeginsFromCurrentState:YES];
    

    If you add that line right after beginAnimations:context: your code works perfectly.

    0 讨论(0)
  • 2020-12-02 05:30

    Just use the UIKeyboardFrameBeginUserInfoKey or UIKeyboardFrameEndUserInfoKey key instead of UIKeyboardBoundsUserInfoKey

    0 讨论(0)
  • 2020-12-02 05:34

    Its worked like this

    This is the constraint of the save button bottom

    @IBOutlet weak var saveBtnBottom: NSLayoutConstraint!
    @IBOutlet weak var nameText: UITextField!
    

    Inside viewDidLoad

    NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    nameText.delegate = self
    

    This is the functions we need

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        nameText.resignFirstResponder()
        return true
    }
    
    
    @objc func keyBoardWillShow(notification: Notification){
        if let userInfo = notification.userInfo as? Dictionary<String, AnyObject>{
            let frame = userInfo[UIResponder.keyboardFrameEndUserInfoKey]
            let keyBoardRect = frame?.cgRectValue
            if let keyBoardHeight = keyBoardRect?.height {
                self.saveBtnBottom.constant = keyBoardHeight 
    
                UIView.animate(withDuration: 0.5, animations: {
                    self.view.layoutIfNeeded()
                })
            }
        }
    }
    
    @objc func keyBoardWillHide(notification: Notification){
        self.saveBtnBottom.constant = 30.0
        UIView.animate(withDuration: 0.5, animations: {
            self.view.layoutIfNeeded()
        })
    }
    
    0 讨论(0)
提交回复
热议问题