2016-11-27 46 views
-2

我环顾四周,发现this后显示键盘出现时移动视图。它工作的很好,随时随地移动键盘,我点击一个UITextField。问题是我有三个UITextField s,并且只有当键盘出现在UITextField以上时,键盘才会移动。我也查看了苹果documentation,并发现了一些有用的信息,但我仍然没有获得所需的功能。当键盘显示在UITextField上时移动视图

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
     var aRect = self.view.frame; 

     aRect.size.height -= keyboardSize.size.height 

     if self.view.frame.origin.y == 0{ 
      if aRect.contains(activeField.frame.origin){ 
       self.view.frame.origin.y -= keyboardSize.height 
      } 
     } 
    } 
} 

func textFieldDidBeginEditing(_ textField: UITextField) { 
    activeField = textField 
} 

func textFieldDidEndEditing(_ textField: UITextField) { 
    activeField = nil 
} 

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

从Apple文档我只是把我在那里创建aRect,然后检查点与contains功能交叉的部分。我希望这会让视图仅在键盘与文本框重叠时才移动,否则保持视图不变。由于某些原因,我不完全了解,情况并非如此。在任何文本字段被点击的情况下,键盘将移动视图(即使对于某些它不应该)。我现在玩了一会儿,并尝试调试但未成功。有任何想法吗?

编辑:我做了一些调试,似乎aRect.contains(...)返回true时,所有的文本字段被点击,但实际上它不应该。是否包含正确的使用方法?

+0

请检查我编辑的答案。 –

回答

1

我跟着这种方式来管理你可以在视图管理的TableView同样这样的问题在这里是一步一步的代码:

内viewDidLoad中添加registerForKeyboardNotifications()

这里是方法

func registerForKeyboardNotifications() { 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil) 
    } 

再次定义其他方法:

func keyboardWasShown(aNotification: NSNotification) { 
     let info = aNotification.userInfo as! [String: AnyObject], 
     kbSize = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue().size, 
     contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: kbSize.height, right: 0) 

     electricalViewListTableview.contentInset = contentInsets 
     electricalViewListTableview.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 = self.view.frame 
     aRect.size.height -= kbSize.height 

     if let activeTF = activeField { 
      if !CGRectContainsPoint(aRect, activeTF.frame.origin) { 
       electricalViewListTableview.scrollRectToVisible(activeTF.frame, animated: true) 
      } 
     } 
    } 

键盘隐藏方法:

func keyboardWillBeHidden(aNotification: NSNotification) { 
     let contentInsets = UIEdgeInsetsZero 
     electricalViewListTableview.contentInset = contentInsets 
     electricalViewListTableview.scrollIndicatorInsets = contentInsets 
    } 

这种使用方法UITextFieldDelegates跟踪活动的文本框后: VAR activeField:的UITextField?

func textFieldDidBeginEditing(textField: UITextField) { 
    self.activeField = textField 
} 

func textFieldDidEndEditing(textField: UITextField) { 
    self.activeField = textField 
} 

希望它有帮助!

1

尝试IQKeyboardManager。它会自动管理文本字段以使其可见。您只需将其添加到您的项目中,而无需编写一行代码。从它一块的文档:

通常在开发一个应用程序,我们遇到了一个问题,其中iPhone 键盘向上滑动并覆盖的UITextField/UITextView的。 IQKeyboardManager可让您防止键盘滑动并覆盖UITextField/UITextView,而无需输入任何 代码,无需其他设置。要使用IQKeyboardManager,您只需将源文件添加到您的项目中即可。

编辑:除了Rmaddy的回答,我只能说,你应该考虑改变if aRect.contains(activeField.frame.origin)if !aRect.contains(activeField.frame),因为第一次检查将返回true即使你的文本框的顶部视图的框架,并另外,你应该检查它是否不包含你的文本框的框架,然后改变视图的框架。 而且,我并不完全确定,但是,如果您将activeField = textField代码移至textFieldShouldBeginEditing委托方法,可能会更好。

+1

问题是关于发布的代码。这个“答案”没有试图解释发布的代码不工作的原因。 – rmaddy

+0

是的,我也想回答这个问题,没有那么多时间。我会添加答案。 –

1

您的keyboardWillShow代码有两个主要问题。

  1. 您正在使用错误的键来获取键盘框架。您需要UIKeyboardFrameEndUserInfoKey,而不是UIKeyboardFrameBeginUserInfoKey。你想知道键盘将在哪里结束,而不是从哪里开始。
  2. 一旦你得到键盘的框架,你需要将其转换为本地坐标。它以屏幕坐标给你。

你更新的代码将是:

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardScreenFrame = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { 
     let keyboardLocalFrame = self.view.convert(keyboardScreenFrame, from: nil) 
     var aRect = self.view.frame; 

     aRect.size.height -= keyboardLocalFrame.size.height 

     if self.view.frame.origin.y == 0 { 
      if aRect.contains(activeField.frame.origin) { 
       self.view.frame.origin.y -= keyboardSize.height 
      } 
     } 
    } 
} 

你也有你的keyboardWillHide方法的一个大问题。由于keyboardWillShow方法总是会缩短视图的框架,因此您的keyboardWillHide方法也需要始终恢复视图的框架高度。

如果我是你,我不会在任何一种方法中改变视图的高度。只需根据需要调整其来源即可使文本字段可见。

+0

这仍然不适合我。仍然会出现键盘会移动整个视图,无论点击哪个文本字段。并澄清,是不是正在调整帧的来源正是我已经在做什么?如果不是通过self.view.frame.origin.y来修改框架的原点,我该怎么办?对不起,对于Swift和iOS来说相当新颖,所以这些问题看起来可能有点初学者。 – mufc

相关问题