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) 在键盘上方可见。

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);
}