键盘显示secureTextEntry时的移动视图

时间:2015-03-27 01:38:28

标签: ios swift keyboard uitextfield

当键盘出现时,我试图移动我的自我。

我使用了法线:

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

除密码外,我的常用功能似乎对所有这些功能都很好。不幸的是,当我点击" next / return"在我的电子邮件UITextField上。它将我的观点提高了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
}

我还在我的touchesBegan活动中添加了self.view.frame = originalFrame,因为如前所述,它不仅仅是在返回时。

但上述尝试并不起作用,此处是从电子邮件字段中点击下一步后的密码字段的屏幕截图。在解雇文本字段后它也保持这种状态。

enter image description here

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

它混乱的原因是由于我的errorView改变了高度。这样originalFrame现在不正确。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

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

您可以执行以下操作:

var originalFrame: CGRect!

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

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

    return false
}

修改1:

我刚注意到上面的代码只有点击返回按钮才有效。只要文本字段占用第一个响应者,就应该重置视​​图的框架。


编辑2:

如果您在内容视图中使用UIScrollView,则应该可以轻松解决此问题。在UIScrollView中嵌入表单元素,只要应用程序触发keyboardWillShow:keyboardWillHide:,您就会根据键盘高度调整contentInset属性UIScrollView可以从通知的userInfo)获得。

无论如何,既然您无需使用UIScrollView即可解决问题,这里解释了为什么您的方法不起作用以及您可能如何使用它:

  1. 首先,您试图在内容视图中减去/添加固定高度160px。您必须了解键盘高度在不同设备上有所不同。一个好的方法是使用从NSNotification userInfo获得的键盘高度。您可以通过notification.userInfokeyboardWillShow:中的keyboardWillHide:轻松获取此内容。

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

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