Ios 键盘显示secureTextEntry时移动视图

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

当键盘出现时,我正试图向上移动我的self.view

我用的是普通的:

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()中设置的。我不知道你能不能解释一下为什么会这样?或者编辑你的答案,我会接受的。