我的应用程序中有注册表单。它有大约7个用户填写的字段。 键盘下有些字段。
键盘隐藏了最后3个文本字段 - 所以我想只为它们移动框架。 我认为移动文本字段是个坏主意,因为我不仅应该移动文本字段,还要移动每个文本字段的标签。 我对视图底部没有约束。我的所有元素都与顶部元素的垂直间距是这个视图。
怎么做?
我认为它很明显且易于解决但却找到了许多建议(这些建议都没有对我有用)。
答案 0 :(得分:0)
我认为您可以创建一个UIView,并将所有控件(textFields和标签)放在视图的顶部。 然后,只要用户点击将被键盘隐藏的textFields,您就可以将UIView的“contentInset”值设置为适当的值。 例如: self.palletView.contentInset = UIEdgeInsetsMake(-kKeyboardHeight,0,-kKeyboardHeight,0);
答案 1 :(得分:0)
我建议为事件UIKeyboardWillChangeFrameNotification
和UIKeyboardWillHideNotification
添加通知观察器,然后相应地更新您的视图约束。以下示例在Obj-C而不是Swift中,但您明白了这一点:
在你的控制器viewDidLoad中:
[[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
是键盘完成显示时的高度,因此您可以从视图高度中减去此值以获得可见区域高度。
由于视图顶部只有约束,因此您可能还希望在视图底部添加一个优先级较低的视图。使这些约束IBOutlets并更新其常量和/或根据需要设置活动/非活动。 (注意:不要尝试更新优先级,否则会发生不好的事情。)
如果您有太多文本字段无法放入可查看区域但希望将它们全部显示,您可以考虑将它们放在UIScrollView或UITableView中,并相应地调整这些视图的约束。