从预测键盘切换到简单键盘(iOS 8)时,UIScrollView(包含多个UITextFields)上下跳动
问题描述:
我试图处理屏幕上的键盘外观并移动UIScrollView(tfScroll)以使我的所有UITextFields(tf1,tf2,tf3,tf4,tf5,tf6,tf7)在键盘上方可见。从预测键盘切换到简单键盘(iOS 8)时,UIScrollView(包含多个UITextFields)上下跳动
- 我已经添加了键盘通知 (UIKeyboardWillShowNotification,UIKeyboardWillHideNotification)在 viewWillAppear中方法。
- 我做“修正”文本框TF1,TF3,TF5的选项,TF 7 YES,和文本框的其余NO即键盘与“YES”,以校正选项将预测吧和其他'没有'更正选项将不会有预测条。
- 滚动型的滚动非常精细,所有文本框都可见 除了一个问题,当键盘 的预测栏出现或消失,滚动视图反弹的顶部,然后涉及到它的正确位置,这看起来很奇怪。
- 但是,如果我关闭所有文本框的键盘的预测栏,然后 滚动视图顺利滚动。
- 请建议一些方法来从简单的键盘处理在 切换情况下,粗糙滚动到perdictive_bar键盘。
- 这里是我已经实现做上述过程的代码:
编译马克 - 我发现错误在我的代码键盘通知
- (void)keyboardWillShow: (NSNotification *) noti
{
NSDictionary *info = [noti userInfo];
float kbOffset = [[[noti userInfo] valueForKey:@"UIKeyboardFrameEndUserInfoKey"] CGRectValue].origin.y;
CGSize keyboardSize = [info[UIKeyboardFrameEndUserInfoKey]CGRectValue].size;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[info[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
[UIView setAnimationCurve:[info[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
[UIView setAnimationBeginsFromCurrentState:YES];
UIEdgeInsets insets = UIEdgeInsetsMake(tfScroll.contentInset.top, 0, keyboardSize.height+10.0, 0);
tfScroll.contentInset = insets;
tfScroll.scrollIndicatorInsets = insets;
float tfOffset ;
if (tf1.isEditing)
{
tfOffset = tfScroll.frame.origin.y + tf1.frame.origin.y + tf1.frame.size.height ;
}
else if (tf2.isEditing)
{
tfOffset = tfScroll.frame.origin.y + tf2.frame.origin.y + tf2.frame.size.height ;
}
else if (tf3.isEditing)
{
tfOffset = tfScroll.frame.origin.y + tf3.frame.origin.y + tf3.frame.size.height ;
}
else if (tf4.isEditing)
{
tfOffset = tfScroll.frame.origin.y + tf4.frame.origin.y + tf4.frame.size.height ;
}
else if (tf5.isEditing)
{
tfOffset = tfScroll.frame.origin.y + tf5.frame.origin.y + tf5.frame.size.height ;
}
else if (tf6.isEditing)
{
tfOffset = tfScroll.frame.origin.y + tf6.frame.origin.y + tf6.frame.size.height ;
}
else if (tf7.isEditing)
{
tfOffset = tfScroll.frame.origin.y + tf7.frame.origin.y + tf7.frame.size.height ;
}
if ((kbOffset - tfOffset) < 0)
{
CGFloat y = (kbOffset - tfOffset);
tfScroll.contentOffset = CGPointMake(tfScroll.frame.origin.x, y);
}
[UIView commitAnimations];
}
- (void)keyboardWillHide: (NSNotification *) noti
{
UIEdgeInsets insets = UIEdgeInsetsMake(tfScroll.contentInset.top, 0, 0, 0);
tfScroll.contentInset = insets;
tfScroll.scrollIndicatorInsets = insets;
tfScroll.contentOffset = CGPointMake(tfScroll.frame.origin.x, 0);
}
答
。这是愚蠢的错误,但。当我改变UIScrollView的'内容偏移量'以在'keyboardWillShow'方法中将隐藏的UITextFields拉到键盘上方时,我将负数'y轴'分配给内容偏移量,这导致了我的滚动视图中的反弹(因为(kbOffset - tfOffset)为负)。
因此,我在上面的代码中做了一点改动,为scrollview提供了+ y轴位移,并且开始正常运行。
if ((kbOffset - tfOffset) < 0)
{
CGFloat y = (tfOffset - kbOffset);
tfScroll.contentOffset = CGPointMake(tfScroll.frame.origin.x, y);
}