[英]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
)调整UIScrollView
的contentInset
属性。
无论如何,由于您无需使用UIScrollView
即可解决了问题,因此以下说明了您的方法为何行不通以及您如何使它行得通:
首先,您尝试为内容视图减去/增加固定高度160px
。 您必须了解不同设备上的键盘高度不同。 一个好的方法是使用从NSNotification
userInfo
获得的键盘高度。 可通过您的keyboardWillShow:
或keyboardWillHide:
notification.userInfo
轻松检索到此信息。
您没有将self.view
重置为其原始框架。 这可能会导致帧的Y原点被修改多次而不重置,导致减去的像素增加一倍, UIKeyboardWillShowNotification
。由于您使用的是UIKeyboardWillShowNotification
self.view.frame.origin.y -= 160
,如果UIKeyboardWillShowNotification
通知没有当您切换到密码字段时触发,该帧的原点不会重置,并且会减去160px
。
每当您切换密码文本字段时, UIKeyboardWillHideNotification
可能不会一直触发。 我仍然需要确认这一点,但这可能是未调用keyboardWillHide:
函数的原因,因此减去了另外的160px
而不是加上160px
然后减去160px
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.