Ios 键盘显示secureTextEntry时移动视图
当键盘出现时,我正试图向上移动我的self.view 我用的是普通的:Ios 键盘显示secureTextEntry时移动视图,ios,swift,keyboard,uitextfield,Ios,Swift,Keyboard,Uitextfield,当键盘出现时,我正试图向上移动我的self.view 我用的是普通的: NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: Sel
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil)
在我的视图中加载()
,就像我通常做的那样。使用这两个函数
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
,它才会出错,因此我不能在textfield中指定视图移动的程度,也不能在textfield中返回
考虑到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
添加到了我的touchesbeent事件中,因为正如前面提到的,它不仅仅是在返回时
但是上面的尝试没有成功,这里是在从email字段单击next之后的密码字段的屏幕截图。而且在删除了文本字段之后,它仍然保持这种状态
我还尝试使用self.view.frame=originalframe.origin.y+160
将其向上移动。但仍然会导致密码字段出现问题
它搞砸的原因是因为我的errorView改变了高度。将其设置为原始帧现在不正确
任何帮助都将不胜感激 不久前我经历过这种情况。似乎您的键盘将隐藏:
方法在密码字段成为第一响应者时未被调用
您可以在textfield返回:
中将视图的原点重置为其原始值,而不是通过添加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
中,每当应用程序启动keyboard时,将显示:
或keyboard将隐藏:
,您将根据键盘高度(您可以从通知的userInfo
中获得)调整UIScrollView
的contentInset
属性
无论如何,由于您不必使用UIScrollView
,就解决了这个问题,下面解释一下为什么您的方法不起作用,以及您可能是如何让它起作用的:
首先,您试图在内容视图中减去/添加一个固定高度160px
。您必须了解不同设备上的键盘高度不同。一个好的方法是使用从NSNotification
userInfo
获得的键盘高度。这可以通过通知轻松检索。键盘中的userInfo
将显示:
或键盘将隐藏:
您没有将self.view
重置为其原始帧。这会导致多次修改帧的Y原点而不重置,导致减去的像素加倍,等等。由于您使用的是self.view.frame.origin.Y-=160
,如果切换到密码字段时未触发UIKeyboardWillShowNotification
通知,帧的原点将不会重置,然后再减去一个160px
UIKeyboardWillHideNotification
在您切换密码文本字段时,可能不会一直触发。我仍然需要确认这一点,但这可能是您的键盘将隐藏的原因:
函数没有被调用,因此减去额外的160px
,而不是添加160px
,然后减去160px
试过了,但还是搞砸了。我将用更新的截图编辑我的帖子有什么特殊原因不能使用UIScrollView吗?如果可以,这将有很大帮助:我用scrollview重拨了viewController。并在链接中添加了准确的代码。然而,当我点击一个文本字段,键盘显示时,任何东西都不会移动。(我的scrollview命名为相同的)。过了一会儿,我终于设法使一个版本正常工作。老实说,我不知道为什么会这样?但我无法用以下代码打破它:func键盘willshow(sender:NSNotification){self.view.frame.origin.y=originalFrameY-100}func键盘willhide(sender:NSNotification){self.view.frame=CGRectMake(0,50,self.view.bounds.width,self.view.bounds.height)}
其中originalframe
是self.view.frame.origin.y
在viewDidLoad()中设置的。我不知道你能不能解释一下为什么会这样?或者编辑你的答案,我会接受的。