繁体   English   中英

当键盘显示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() ,就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上的“下一个/返回”时。 这使我的观点又提高了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 ,因为如前所述,它不仅返回。

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

在此处输入图片说明

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

弄乱的原因是由于我的errorView改变了高度。 使其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:

我只是注意到上面的代码仅在您点击返回按钮时才起作用。 每当文本字段退出第一响应者时,都应重置视图的框架。


编辑2:

如果您在内容视图中使用了UIScrollView ,则应该可以轻松解决此问题。 将表单元素嵌入UIScrollView并且每当应用程序触发keyboardWillShow:keyboardWillHide: ,您都可以根据键盘高度(可以从通知的userInfo )调整UIScrollViewcontentInset属性。

无论如何,由于您无需使用UIScrollView即可解决了问题,因此以下说明了您的方法为何行不通以及您如何使它行得通:

  1. 首先,您尝试为内容视图减去/增加固定高度160px 您必须了解不同设备上的键盘高度不同。 一个好的方法是使用从NSNotification userInfo获得的键盘高度。 可通过您的keyboardWillShow:keyboardWillHide: notification.userInfo轻松检索到此信息。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM