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

时间:2015-03-19 01:32:41

标签: ios uiscrollview keyboard uitextfield autolayout

我正在尝试处理屏幕上的键盘外观并移动UIScrollView( tfScroll )来制作我的所有UITextFields( tf1,tf2,tf3,tf4,tf5,tf6,tf7 )键盘上方可见。

  • 我添加了键盘通知 ( UIKeyboardWillShowNotification UIKeyboardWillHideNotification )in viewWillAppear方法。
  • 我对textfields tf1,tf3,tf5,tf7进行了'更正'选项 ,其余的文字字段为,即对“修正”选项为“是”的键盘将具有预测栏,而其他人则为“否”修正选项不会有预测栏
  • ScrollView滚动非常精细,所有文本字段都可见 除了一个问题,当键盘的预测栏出现消失,滚动视图反弹到顶部,然后到达正确的位置,这看起来很奇怪。
  • 但如果我关闭/打开所有文本字段的键盘的预测栏,那么 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);
}

1 个答案:

答案 0 :(得分:0)

我在代码中发现了错误。虽然这是一个愚蠢的错误。当我更改“内容偏移量”时UIScrollView将键盘上方隐藏的UITextFields拉出键盘,然后显示&#39;方法,我正在指定负面的“y轴”&#39;内容偏移,导致我的滚动视图中的反弹(因为(kbOffset - tfOffset)的差异为负)。

所以我在上面的代码中做了一些改动,为Scrollview提供+ ve轴偏移,并开始正常运行。

 if ((kbOffset - tfOffset) < 0)
{
    CGFloat y = (tfOffset - kbOffset);

    tfScroll.contentOffset = CGPointMake(tfScroll.frame.origin.x, y);
}