UIScrollView在键盘上向上滚动



问题陈述:我有UIView的笔尖文件包含UIScrollview,在滚动视图中,我有几个文本字段和一个底部的文本视图。我想要的是当文本字段或文本视图开始编辑时向上滚动。

我试过什么:

在习惯方法

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

我称此方法为父视图。

通知处理:

func keyboardWasShown(notification: NSNotification)
{
    var userInfo = notification.userInfo!
    var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    keyboardFrame = self.convert(keyboardFrame, from: nil)
    var contentInset:UIEdgeInsets = self.mainScroll.contentInset
    contentInset.bottom = keyboardFrame.size.height
    self.mainScroll.contentInset = contentInset
}

这非常适合UITextFields,但不适用于UITextView。任何知道错误在哪里。

PS:我已经设置了UITextField和UITextView的代表。

任何帮助将不胜感激。

将 keyboardWasShow 函数替换为以下函数:

 func keyboardWasShown(notification: NSNotification)
{
    var userInfo = notification.userInfo!
    var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    keyboardFrame = self.convert(keyboardFrame, from: nil)
    self.mainScroll.contentOffset = CGPoint(x: 0, y: keyboardFrame.size.height - Any number that fits your need.)
}

在键盘将隐藏:

self.mainScroll.contentOffset = CGPoint(x: 0, y: 0)

希望它会有所帮助。祝您编码愉快!

演示链接 : https://github.com/harshilkotecha/UIScrollViewWhenKeyboardAppearInSwift3

当您有多个文本视图时,这非常困难,因此最佳解决方案 ->

步骤 1:添加 UITextFieldDelegate

class ScrollViewController: UIViewController,UITextFieldDelegate {

步骤2:创建新的IBOutlet,但不连接任何文本字段

//  get current text box when user Begin editing
    @IBOutlet weak var activeTextField: UITextField?

步骤3:当用户专注于文本文件对象传递引用并存储在activeTextField中时,编写这两个方法

// get current text field
    func textFieldDidBeginEditing(_ textField: UITextField)
    {
        activeTextField=textField;
    }
    func textFieldDidEndEditing(_ textField: UITextField)
    {
        activeTextField=nil;
    }

第 5 步:在视图中设置通知加载设置通知键盘

override func viewWillAppear(_ animated: Bool) {
        // call method for keyboard notification
        self.setNotificationKeyboard()
    }
    // Notification when keyboard show
    func setNotificationKeyboard ()  {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: .UIKeyboardWillHide, object: nil)
    }

步骤6:隐藏和显示键盘的两种方法

func keyboardWasShown(notification: NSNotification)
    {
        var info = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
        let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height+10, 0.0)
        self.scrollView.contentInset = contentInsets
        self.scrollView.scrollIndicatorInsets = contentInsets
        var aRect : CGRect = self.view.frame
        aRect.size.height -= keyboardSize!.height
        if let activeField = self.activeTextField
        {
            if (!aRect.contains(activeField.frame.origin))
            {
                self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
            }
        }
    }
    // when keyboard hide reduce height of scroll view
    func keyboardWillBeHidden(notification: NSNotification){
        let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0,0.0, 0.0)
        self.scrollView.contentInset = contentInsets
        self.scrollView.scrollIndicatorInsets = contentInsets
        self.view.endEditing(true)
    }

Swift 5

NotificationCenter.default.addObserver(self, selector: #selector(keyboardNotification), name: UIResponder.keyboardDidChangeFrameNotification, object: nil)

@objc func keyboardNotification(_ notification: Notification) {
        if let userInfo = (notification as NSNotification).userInfo {
            let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
            let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
            let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
            let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions().rawValue
            let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
            if (endFrame?.origin.y)! >= UIScreen.main.bounds.size.height {
                scrollViewBottomConstraint?.constant = 0
            } else {
                if tabBarController?.tabBar.frame == nil {
                    return
                }
                scrollViewBottomConstraint?.constant = endFrame!.size.height - (tabBarController?.tabBar.frame.height)!
                let bottomOffset = CGPoint(x: 0, y: 0)
                scrollView.setContentOffset(bottomOffset, animated: true)
            }
            UIView.animate(withDuration: duration, delay: 0, options: animationCurve, animations: { self.view.layoutIfNeeded() }, completion: nil)
        }
    }

用法:

1.connect the scrollView outlet to your controller and set its name to 'scrollView'
2.connect the scrollView bottom constraint to your controller & set its name to 'scrollViewBottomConstraint'
3.put the notification observer to your ViewDidLoad function.

相关内容

  • 没有找到相关文章

最新更新