从预测键盘切换到简单键盘(iOS 8)时,UIScrollView(包含多个UITextFields)上下跳动

问题描述:

我试图处理屏幕上的键盘外观并移动UIScrollView(tfScroll)以使我的所有UITextFields(tf1,tf2,tf3,tf4,tf5,tf6,tf7)在键盘上方可见。从预测键盘切换到简单键盘(iOS 8)时,UIScrollView(包含多个UITextFields)上下跳动

  • 我已经添加了键盘通知 (UIKeyboardWillShowNotificationUIKeyboardWillHideNotification)在 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); 
}