Ios 在指定的文本字段下显示键盘

Ios 在指定的文本字段下显示键盘,ios,iphone,swift,Ios,Iphone,Swift,我的应用程序中有注册表。它有大约7个用户正在填写的字段。 但有些字段在键盘下 键盘隐藏了最后3个文本字段,所以我只想为它们移动帧。 我认为移动文本字段是个坏主意,因为我不仅应该移动文本字段,还应该移动每个文本字段的标签。 我对视图的底部没有限制。“我的所有元素”与此视图中的顶部元素之间都有垂直间距 如何做到这一点 我认为这很明显,也很容易解决,但找到了很多建议(没有一个对我有效)。我认为您可以创建一个UIView,并将所有控件(文本字段和标签)放在视图的顶部。 然后,每当用户点击键盘隐藏的文本字

我的应用程序中有注册表。它有大约7个用户正在填写的字段。 但有些字段在键盘下

键盘隐藏了最后3个文本字段,所以我只想为它们移动帧。 我认为移动文本字段是个坏主意,因为我不仅应该移动文本字段,还应该移动每个文本字段的标签。 我对视图的底部没有限制。“我的所有元素”与此视图中的顶部元素之间都有垂直间距

如何做到这一点


我认为这很明显,也很容易解决,但找到了很多建议(没有一个对我有效)。

我认为您可以创建一个UIView,并将所有控件(文本字段和标签)放在视图的顶部。 然后,每当用户点击键盘隐藏的文本字段时,您就将UIView的“contentInset”值设置为适当的值。 例如:
self.palletView.contentInset=UIEdgeInsetsMake(-kKeyboardHeight,0,-kKeyboardHeight,0)

我认为您可以创建一个UIView,并将所有控件(文本字段和标签)放在该视图的顶部。 然后,每当用户点击键盘隐藏的文本字段时,您就将UIView的“contentInset”值设置为适当的值。 例如:
self.palletView.contentInset=UIEdgeInsetsMake(-kKeyboardHeight,0,-kKeyboardHeight,0)

我建议为事件添加通知观察员
UIKeyboardWillChangeFrameNotification
UIKeyboardWillHideNotification
,然后相应地更新视图约束。下面的例子在Obj-C中不是Swift,但你明白了:

在控制器视图中,加载:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillChangeFrameNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
并在控制器中实现以下方法:

- (void)keyboardWillShow:(NSNotification *)notification {
    if (self.presentedViewController) return;

    NSDictionary *info = [notification userInfo];
    NSValue *kbFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect keyboardFrame = [kbFrame CGRectValue];

    CGFloat height = keyboardFrame.size.height;

    // Update constraints here

    [UIView animateWithDuration:animationDuration animations:^{
        [self.view layoutIfNeeded];
    }];
}


- (void)keyboardWillHide:(NSNotification *)notification {
    NSDictionary *info = [notification userInfo];
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // Update constraints here

    [UIView animateWithDuration:animationDuration animations:^{
        [self.view layoutIfNeeded];
    }];
}
这将使用键盘动画及时设置约束更改的动画。在
keyboardWillShow
方法中,
height
是键盘完成显示时的高度,因此您可以从视图高度中减去该高度以获得可见区域高度

由于只有视图顶部的约束,因此可能还需要将一个约束添加到视图底部,优先级较低。使这些约束条件生效,并根据需要更新其常数和/或设置为激活/非激活。(注意:不要尝试更新优先级,否则会发生不好的事情)


如果您有太多的文本字段无法容纳在可视区域中,但希望将它们全部显示出来,您可以考虑将它们放在UISCLVIEW或UITababVIEW中,并相应地调整这些视图的约束。

< P>我建议添加事件的通知观察员>代码> UIKEBOBORATION,更改代码>和<代码> UIKEKBOADWHIDENENOTITY < /代码>,然后相应地更新视图约束。下面的例子在Obj-C中不是Swift,但你明白了:

在控制器视图中,加载:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillChangeFrameNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
并在控制器中实现以下方法:

- (void)keyboardWillShow:(NSNotification *)notification {
    if (self.presentedViewController) return;

    NSDictionary *info = [notification userInfo];
    NSValue *kbFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect keyboardFrame = [kbFrame CGRectValue];

    CGFloat height = keyboardFrame.size.height;

    // Update constraints here

    [UIView animateWithDuration:animationDuration animations:^{
        [self.view layoutIfNeeded];
    }];
}


- (void)keyboardWillHide:(NSNotification *)notification {
    NSDictionary *info = [notification userInfo];
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // Update constraints here

    [UIView animateWithDuration:animationDuration animations:^{
        [self.view layoutIfNeeded];
    }];
}
这将使用键盘动画及时设置约束更改的动画。在
keyboardWillShow
方法中,
height
是键盘完成显示时的高度,因此您可以从视图高度中减去该高度以获得可见区域高度

由于只有视图顶部的约束,因此可能还需要将一个约束添加到视图底部,优先级较低。使这些约束条件生效,并根据需要更新其常数和/或设置为激活/非激活。(注意:不要尝试更新优先级,否则会发生不好的事情)

如果在可查看区域中有太多文本字段适合,但要保持它们全部显示,可以考虑将它们放在UISCLVIEW或UITababVIEW中,并相应地调整这些视图的约束。