为 secureTextEntry 显示键盘时移动视图

Moving view when keyboard shows for secureTextEntry

当键盘出现时,我正在尝试向上移动 self.view。

我用的是正常的:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil)

在我的 viewDidLoad() 中,就像我平时做的那样。有了这两个功能。

func keyboardWillShow(sender: NSNotification) {
    self.view.frame.origin.y -= 160
}
func keyboardWillHide(sender: NSNotification) {
    self.view.frame.origin.y += 160
}

不过这个观点特殊。 UITextFields.

有不同的键盘类型

具体来说,这些文本字段是:

firstName - normal keyboard
lastName - normal keyboard
email - email keyboard
password - secureTextEntry

除了密码外,我的常用功能似乎对所有功能都能正常工作。不幸的是,当我在我的电子邮件 UITextField 上单击 "next/return" 时。它使我的观点又上升了 160 点。

它显然认为我正在添加另一个键盘,而不是删除一个。

我的第一个想法是简单地在调用特定 UITextField 时更改值。但是当我单击密码 UITextField.

时,视图会按预期运行

只有当我当前处于其他视图之一时才会出现问题,然后单击下一步或点击密码 UITextFIeld,因此我不能仅指定视图移动了多少,在 textFieldShouldReturn 要么。

如何正确向上移动视图,同时考虑到 secureTextEntry 问题?

根据 Joko Sarmiento 的建议,我也尝试了这个:

var originalFrame: CGRect!

override func viewDidLoad() {
    originalFrame = self.view.frame
}

func textFieldShouldReturn(textField: UITextField) -> Bool {
    self.view.frame = originalFrame
    return false
}

我还将 self.view.frame = originalFrame 添加到我的 touchesBegan 事件中,因为如前所述,它不仅在 return.

但上述尝试没有成功,这是在电子邮件字段中单击下一步后密码字段的屏幕截图。在关闭文本字段后它也保持这种状态。

我也尝试用 self.view.frame = originalframe.origin.y+160 来提高它。但是仍然会导致密码字段出现问题。

它乱七八糟的原因是我的错误视图改变了高度。使 originalFrame 现在不正确。

如有任何帮助,我们将不胜感激!

我前阵子经历过。当密码字段成为第一响应者时,您的 keyboardWillHide: 方法似乎没有被调用。

您可以将视图的原点重置为其在 textFieldShouldReturn: 中的原始值,而不是通过添加 160px,而是使用您在 viewDidLoad 中设置的 originalValue 变量。

您可以这样做:

var originalFrame: CGRect!

override func viewDidLoad() {
    originalFrame = self.view.frame
}

func textFieldShouldReturn(textField: UITextField) -> Bool {
    self.view.frame = originalFrame

    return false
}

编辑 1:

我刚刚注意到上面的代码只有在您点击 return 按钮时才会起作用。每当文本字段退出第一响应者时,您应该重置视​​图的框架。


编辑 2:

如果您在内容视图中使用 UIScrollView,这个问题应该很容易解决。在 UIScrollView 中嵌入您的表单元素,每当应用程序触发 keyboardWillShow:keyboardWillHide: 时,您根据键盘调整 UIScrollViewcontentInset 属性高度(您可以从通知的 userInfo 中获取)。

无论如何,由于您无需使用 UIScrollView 就解决了问题,这里解释了为什么您的方法不起作用以及您如何让它起作用:

  1. 首先,您试图 subtract/add 内容视图的固定高度 160px。您必须了解不同设备的键盘高度不同。一个好的方法是使用从 NSNotification userInfo 获得的键盘高度。这可以通过 keyboardWillShow:keyboardWillHide: 中的 notification.userInfo 轻松检索。

  2. 您并未将 self.view 重置为其原始框架。这可能会导致帧的 Y 原点被修改多次而不被重置,导致减去的像素加倍等。由于您使用的是 self.view.frame.origin.y -= 160,如果 UIKeyboardWillShowNotification 通知在您使用时没有触发切换到您的密码字段,框架的原点不会重置,并减去额外的 160px.

  3. 每当您切换密码文本字段时,
  4. UIKeyboardWillHideNotification 可能不会一直触发。我仍然需要确认这一点,但这可能是你的 keyboardWillHide: 函数没有被调用的原因,因此减去一个额外的 160px 而不是添加 160px 然后减去 160px .