UIScrollView(包含 UITextFields 的数量)在从预测键盘切换到简单键盘时上下弹跳(iOS 8)
UIScrollView (containing number of UITextFields) is bouncing up and down while switching from predictive keyboard to simple keyboard (iOS 8)
我正在尝试处理屏幕上的键盘外观并移动 UIScrollView (tfScroll) 以使我的所有 UITextFields (tf1, tf2, tf3, tf4, tf5, tf6, tf7) 在键盘上方可见。
- 我添加了键盘通知
(UIKeyboardWillShowNotification, UIKeyboardWillHideNotification) 在
viewWillAppear 方法。
- 我为文本字段 tf1、tf3、tf5、tf7 创建了 'correction' 选项
YES,其余文本字段为 NO,即具有 'YES' 更正选项的键盘将具有 预测栏 和其他带有 'NO' 校正选项的人将没有 预测栏 .
- ScrollView 滚动得非常好,所有文本字段都可见
除了一个问题,当键盘的 预测栏
出现或消失,滚动视图跳到顶部然后回到正确的位置,看起来很奇怪。
- 但是如果我为所有文本字段切换off/on键盘的预测栏,那么
scrollview 滚动流畅。
- 请提出一些处理粗糙滚动的方法,以防万一
从 简单键盘 切换到 perdictive_bar 键盘 .
- 这是我执行上述过程的代码:
pragma mark - 键盘通知
- (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 的 'content offset' 以在 'keyboardWillShow' 方法中将隐藏的 UITextFields 拉到键盘上方时,我将负值 'y-axis' 分配给内容偏移量,这会导致我的滚动视图反弹(作为差异(kbOffset - tfOffset) 为负)。
所以我对上面的代码做了一点改动,给Scrollview提供+ve y轴位移,然后启动运行很好。
if ((kbOffset - tfOffset) < 0)
{
CGFloat y = (tfOffset - kbOffset);
tfScroll.contentOffset = CGPointMake(tfScroll.frame.origin.x, y);
}
我正在尝试处理屏幕上的键盘外观并移动 UIScrollView (tfScroll) 以使我的所有 UITextFields (tf1, tf2, tf3, tf4, tf5, tf6, tf7) 在键盘上方可见。
- 我添加了键盘通知 (UIKeyboardWillShowNotification, UIKeyboardWillHideNotification) 在 viewWillAppear 方法。
- 我为文本字段 tf1、tf3、tf5、tf7 创建了 'correction' 选项 YES,其余文本字段为 NO,即具有 'YES' 更正选项的键盘将具有 预测栏 和其他带有 'NO' 校正选项的人将没有 预测栏 .
- ScrollView 滚动得非常好,所有文本字段都可见 除了一个问题,当键盘的 预测栏 出现或消失,滚动视图跳到顶部然后回到正确的位置,看起来很奇怪。
- 但是如果我为所有文本字段切换off/on键盘的预测栏,那么 scrollview 滚动流畅。
- 请提出一些处理粗糙滚动的方法,以防万一 从 简单键盘 切换到 perdictive_bar 键盘 .
- 这是我执行上述过程的代码:
pragma mark - 键盘通知
- (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 的 'content offset' 以在 'keyboardWillShow' 方法中将隐藏的 UITextFields 拉到键盘上方时,我将负值 'y-axis' 分配给内容偏移量,这会导致我的滚动视图反弹(作为差异(kbOffset - tfOffset) 为负)。
所以我对上面的代码做了一点改动,给Scrollview提供+ve y轴位移,然后启动运行很好。
if ((kbOffset - tfOffset) < 0)
{
CGFloat y = (tfOffset - kbOffset);
tfScroll.contentOffset = CGPointMake(tfScroll.frame.origin.x, y);
}