Move UIView up when the keyboard appears in iOS

后端 未结 18 1771
再見小時候
再見小時候 2020-11-28 20:38

I have a UIView, it is not inside UIScrollView. I would like to move up my View when the keyboard appears. Before I tried to use this solution: How can I make a UITextField

相关标签:
18条回答
  • 2020-11-28 20:51

    Swift 4

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil)
    
    @objc func keyboardWillChange(notification: NSNotification) {
    
            let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
            let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
            let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
            let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
            let deltaY = targetFrame.origin.y - curFrame.origin.y
    
            UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                self.YourView.frame.origin.y+=deltaY
            },completion: nil)
        }
    
    0 讨论(0)
  • 2020-11-28 20:52

    Based on theDunc's answer but written in Swift with Autolayout.

    @IBOutlet weak var bottomConstraint: NSLayoutConstraint! // connect the bottom of the view you want to move to the bottom layout guide
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        NSNotificationCenter.defaultCenter().addObserver(self,
                                                         selector: #selector(ConversationViewController.keyboardWillShow(_:)),
                                                         name: UIKeyboardWillShowNotification,
                                                         object: nil)
    
        NSNotificationCenter.defaultCenter().addObserver(self,
                                                         selector: #selector(ConversationViewController.keyboardWillHide(_:)),
                                                         name: UIKeyboardWillHideNotification,
                                                         object: nil)
    }
    
    override func viewWillDisappear(animated: Bool) {
        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
        super.viewWillDisappear(animated)
    }
    
    // MARK: - Keyboard events
    
    func keyboardWillShow(notification: NSNotification) {
        if let userInfo = notification.userInfo,
            keyboardFrame = userInfo[UIKeyboardFrameBeginUserInfoKey]
        {
            let keyboardSize = keyboardFrame.CGRectValue().size
            self.bottomConstraint.constant = keyboardSize.height
            UIView.animateWithDuration(0.3) {
                self.view.layoutIfNeeded()
            }
        }
    }
    
    func keyboardWillHide(notification: NSNotification) {
        self.bottomConstraint.constant = 0
        UIView.animateWithDuration(0.3) {
            self.view.layoutIfNeeded()
        }
    }
    
    0 讨论(0)
  • 2020-11-28 20:52

    I have implemented a custom controller that dynamically calculates the size of the keyboard, scrolling textFields when it appears and disappears, even during rotation of the device. Works with all iOS devices. Just simply inherit the controller to have what you need. You can find it with all the instructions at the following link: https://github.com/mikthebig/ios-textfield-scroll

    0 讨论(0)
  • 2020-11-28 20:57

    Use the following code in order to show and hide the keyboard

    //Declare a delegate, assign your textField to the delegate and then include these methods
    
    -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
        return YES;
    }
    
    
    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
    
        [self.view endEditing:YES];
        return YES;
    }
    
    
    - (void)keyboardDidShow:(NSNotification *)notification
    {
        // Assign new frame to your view 
        [self.view setFrame:CGRectMake(0,-110,320,460)]; //here taken -110 for example i.e. your view will be scrolled to -110. change its value according to your requirement.
    
    }
    
    -(void)keyboardDidHide:(NSNotification *)notification
    {
        [self.view setFrame:CGRectMake(0,0,320,460)];
    }
    
    0 讨论(0)
  • 2020-11-28 20:57

    For all the issue related to KeyBoard just use IQKeyBoardManager it's helpful. https://github.com/hackiftekhar/IQKeyboardManager.

    0 讨论(0)
  • 2020-11-28 21:00

    Here you go. I have used this code with UIView, though. You should be able to make those adjustments for scrollview.

        func addKeyboardNotifications() {
            NotificationCenter.default.addObserver(self,
                                                   selector: #selector(keyboardWillShow(notification:)),
                                                   name: NSNotification.Name.UIKeyboardWillShow, object: nil)
            NotificationCenter.default.addObserver(self,
                                                   selector: #selector(keyboardWillHide(notification:)),
                                                   name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        }
    
        func keyboardWillShow(notification: NSNotification) {
    
            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
                let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
    // if using constraints            
    // bottomViewBottomSpaceConstraint.constant = keyboardSize.height
    self.view.frame.origin.y -= keyboardSize.height
                UIView.animate(withDuration: duration) {
                    self.view.layoutIfNeeded()
                }
            }
        }
        func keyboardWillHide(notification: NSNotification) {
    
            let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
    //if using constraint
    //        bottomViewBottomSpaceConstraint.constant = 0
    self.view.frame.origin.y = 0
            UIView.animate(withDuration: duration) {
                self.view.layoutIfNeeded()
            }
        }
    

    Don't forget to remove notifications at right place.

    func removeKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }
    
    0 讨论(0)
提交回复
热议问题