为 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:
时,您根据键盘调整 UIScrollView
的 contentInset
属性高度(您可以从通知的 userInfo
中获取)。
无论如何,由于您无需使用 UIScrollView
就解决了问题,这里解释了为什么您的方法不起作用以及您如何让它起作用:
首先,您试图 subtract/add 内容视图的固定高度 160px
。您必须了解不同设备的键盘高度不同。一个好的方法是使用从 NSNotification
userInfo
获得的键盘高度。这可以通过 keyboardWillShow:
或 keyboardWillHide:
中的 notification.userInfo
轻松检索。
您并未将 self.view
重置为其原始框架。这可能会导致帧的 Y 原点被修改多次而不被重置,导致减去的像素加倍等。由于您使用的是 self.view.frame.origin.y -= 160
,如果 UIKeyboardWillShowNotification
通知在您使用时没有触发切换到您的密码字段,框架的原点不会重置,并减去额外的 160px
.
每当您切换密码文本字段时,UIKeyboardWillHideNotification
可能不会一直触发。我仍然需要确认这一点,但这可能是你的 keyboardWillHide:
函数没有被调用的原因,因此减去一个额外的 160px
而不是添加 160px
然后减去 160px
.
当键盘出现时,我正在尝试向上移动 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:
时,您根据键盘调整 UIScrollView
的 contentInset
属性高度(您可以从通知的 userInfo
中获取)。
无论如何,由于您无需使用 UIScrollView
就解决了问题,这里解释了为什么您的方法不起作用以及您如何让它起作用:
首先,您试图 subtract/add 内容视图的固定高度
160px
。您必须了解不同设备的键盘高度不同。一个好的方法是使用从NSNotification
userInfo
获得的键盘高度。这可以通过keyboardWillShow:
或keyboardWillHide:
中的notification.userInfo
轻松检索。您并未将
self.view
重置为其原始框架。这可能会导致帧的 Y 原点被修改多次而不被重置,导致减去的像素加倍等。由于您使用的是self.view.frame.origin.y -= 160
,如果UIKeyboardWillShowNotification
通知在您使用时没有触发切换到您的密码字段,框架的原点不会重置,并减去额外的160px
.
每当您切换密码文本字段时,UIKeyboardWillHideNotification
可能不会一直触发。我仍然需要确认这一点,但这可能是你的keyboardWillHide:
函数没有被调用的原因,因此减去一个额外的160px
而不是添加160px
然后减去160px
.