2017-03-20 141 views
2

问题声明:我有UIView的Nib文件包含UIScrollview,在滚动视图中我有几个TextFields和一个TextView在底部。我想要的是当textfield或Textview开始编辑时向上滚动。UIScrollView向上滚动键盘

我试了一下:

在custome方法

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的委托。

任何帮助将不胜感激。

+1

您可以使用contentoffset滚动滚动视图。 – Prabhat

+0

使用https://github.com/hackiftekhar/IQKeyboardManager,它会自动检测textField或textView并相应地管理所有键盘处理。 –

+1

@ZahidShabbir:在textview的情况下,scrollview不滚动或滚动一点? – Poles

回答

0

更换keyboardWasShown功能具有以下功能:

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.) 
} 

在keyBoardWillHide:

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

希望这将有助于。 快乐编码!

1

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

当你有多个TextView的它是如此的困难所以最好的解决方案 - >

第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:在viewDidLoad中setNotificationKeyboard集通知

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) 
    }