viernes, 19 de febrero de 2016

iOS: Moving content that is located under the Keyboard

Swift

override func viewDidLoad() {
     
        self.registerForKeyboardNotifications()
    }
 
    private func registerForKeyboardNotifications() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: .UIKeyboardDidShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: .UIKeyboardWillHide, object: nil)
    }
 
    @objc func keyboardWasShown(notification: Notification) {
        
        if let info = notification.userInfo,
            let kbSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue,
            let activeTextField = self.activeTextField {
            
            let inputAccesoryViewHeight = activeTextField.inputAccessoryView?.frame.height ?? 0
            
            if (keyboardHeight ?? 0) < kbSize.height {
                keyboardHeight = kbSize.height
            }
            
            let finalHeight = keyboardHeight! + inputAccesoryViewHeight
            
            let contentInsets = UIEdgeInsetsMake(0, 0, finalHeight, 0)
            self.scrollView.contentInset = contentInsets
            self.scrollView.scrollIndicatorInsets = contentInsets
            
            var aRect = self.view.frame
            aRect.size.height -= keyboardHeight!
            
            let frame = self.scrollView.convert(activeTextField.frame, from: activeTextField.superview)
            
            var visibleRect = CGRect()
            visibleRect.origin = self.scrollView.contentOffset
            visibleRect.size = self.scrollView.bounds.size
            
            if (!aRect.contains(frame.origin)) {
                self.scrollView.scrollRectToVisible(frame, animated: true)
            }
        }
    }
 
    @objc func keyboardWillBeHidden(notification: Notification) {
     
        let contentInsets = UIEdgeInsets.zero
        self.scrollView.contentInset = contentInsets
        self.scrollView.scrollIndicatorInsets = contentInsets
    }
 
    // UITextFieldDelegate
 
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        self.activeTextField = textField
     
        return true
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        if textField == self.activeTextField {
            self.activeTextField = nil
        }
    }

No hay comentarios:

Publicar un comentario