2017-01-30 44 views
0

我有滚动视图视图控制器内,我在故事板设置它以这种方式(带自动版式):滚动视图和键盘问题斯威夫特

Example

正如你可以看到我添加的所有对象最后一个视图(称为'viewsotto')在滚动视图中。 我的问题是: 这些对象中的一些是textfield,我希望当我点击它和键盘显示它可以在文本框下方,以便我可以看到我写入的内容。 为此,我做了这种方式:

NotificationCenter.default.addObserver(self, selector: #selector(userProfiloGiusto.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(userProfiloGiusto.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 

func keyboardWillShow(notification: NSNotification) { 

     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y == 0{ 
       self.view.frame.origin.y -= keyboardSize.height 
      } 
     } 

    } 

    func keyboardWillHide(notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y != 0{ 
       self.view.frame.origin.y += keyboardSize.height 
      } 
     } 
    } 

,但它不工作。我究竟做错了什么?

+0

检查无需编码https://github.com/hackiftekhar/IQKeyboardManager – karthikeyan

+0

@karthikeyan是对的。它也容易实现。 – vaibby

+0

谢谢。太奇妙了!! –

回答

0

请尝试以下代码。 首先添加var activeField: UITextField?来检查文本字段的可用性。 然后在视图做负载调用这个函数:

override func viewDidLoad() { 
    super.viewDidLoad()self.registerForKeyboardNotifications() 

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) 
    view.addGestureRecognizer(tap) 
    tap.cancelsTouchesInView = false} 


func registerForKeyboardNotifications() 
{ 
    //Adding notifies on keyboard appearing 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ProfileReviewViewController.keyboardWasShown(_:)), name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ProfileReviewViewController.keyboardWillBeHidden(_:)), name: UIKeyboardWillHideNotification, object: nil) 
} 


func deregisterFromKeyboardNotifications() 
{ 
    //Removing notifies on keyboard appearing 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
} 
func keyboardWasShown(notification: NSNotification) 
{ 
    //Need to calculate keyboard exact size due to Apple suggestions 
    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0) 


    self.scrollView.contentInset = contentInsets 
    self.scrollView.scrollIndicatorInsets = contentInsets 
    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize!.height 
    if activeField != nil 
    { 
     if (CGRectContainsPoint(aRect, activeField!.frame.origin)) 
     { 
      scrollView.scrollRectToVisible(activeField!.frame, animated: true) 
     } 
    } 
} 

func keyboardWillBeHidden(notification: NSNotification) 
{ 
    self.scrollView.contentInset = UIEdgeInsetsZero 
} 
//MARK : Textfield delegate methods 
func textFieldDidBeginEditing(textField: UITextField) { 
    activeField = textField 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool { 

    self.view.endEditing(true) 
    activeField = nil 
    return false 
} 
func textFieldShouldEndEditing(textField: UITextField) -> Bool { //delegate method 

    activeField = nil 
    return true 
} 
func dismissKeyboard() { 
    //Causes the view (or one of its embedded text fields) to resign the first responder status. 

    activeField = nil 
    view.endEditing(true) 
} 
0

最有可能使用的是要了解是否有重叠的读数是不正确的。
这是一个常见问题,您正在面对它们的主视图,而应该获取文本框的框架,进行正确的转换以查看键盘是否与其重叠并相应地调整滚动视图的内容插入.z
这在Managing the keyboard文档中有很好的解释。
当键盘显示:

func keyboardWasShown(notification: NSNotification) 
{ 
    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size! 
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0) 


    self.scrollView.contentInset = contentInsets 
    self.scrollView.scrollIndicatorInsets = contentInsets 

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your app might not need or want this behavior. 
    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize.height 
    if let actField = activeField 
    { 
     if (CGRectContainsPoint(aRect, actField.frame.origin)) 
     { 
      scrollView.scrollRectToVisible(actField.frame, animated: true) 
     } 
    } 
} 

重要的一点是,当他们要求查看高度,他们减去键盘的高度,他们检查文本视图的是,区域内。
这个计算可能会改变你的视图层次结构,这是因为框架是一个视图尊重它的超级视图的位置,因此如果你的矩形在另一个视图内,你需要转换它的框架来获得它的框架与主观相关。